一、注入点的不同
(1)数字型注入:
当前端页面存在id等数字类型的输入参数且后端服务器代码对传入的SQL语句中的参数没有做特殊符号闭合时,存在的类型则为数字注入。
测试代码如下:
http://www.xxx.xx.com/?id=1 //正常的URL访问
http://www.xxx.xx.com/?id=1 and 1=2 //页面返回异常则说明存在数字型注入
(2)字符型注入:
若后端服务器代码对传入的SQL语句中的参数做特殊符号闭合,则存在的类型即为字符型注入
测试代码如下:
http://www.xxx.xx.com/?id=1 //正常的URL页面访问
http://www.xxx.xx.com/?id=1 and 1=2 //页面返回正常则可能存在数字注入,页面报错则存在字符型
http://www.xxx.xx.com/?id=1' //通过给传入的参数添加不同符号判断后端代码采用的闭合方式
后端数据库代码:
SELECE * FROM table_name where id='$id';
PS: 该语句采用单引号闭合的方式
二、参数提交方式不同
(1)GET提交方式:
参数通过GET方式提交到后端服务器代码,上传的参数会添加到URL后面
如:http://www.xxx.xx.com/username=xxx&password=xxx
(2)POST提交方式:
POST通过request body传递参数,传递的参数不会在URL后面显示出来
如:http://www.xxx.xx.com
(3)COOKIE传参:
原理:修改本地cookie的值,从而利用cookie来提交非法语句
cookie注入的条件:
条件1、程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤
条件2:在1 的基础上还需要后端服务器程序对提交数据获取的方式为request('xxx')方式,request()方式对传参方式不做要求。
cookie注入需要理解的概念:
javascript:alert(document.cookie="id="+escape("222"))
document.cookie:表示当前浏览器中的cookie变量
alert:表示弹出一个对话框,在该对话框中单击确定按钮确认信息
escape():该函数用于对字符串进行编码
注入方式:
1.判断是否存在cookie注入,通过修改cookie值:
javascript:alert(document.cookie="id="+escape("222"));
在次访问若弹窗则证明存在cookie注入
2.猜解列数:
javascript:alert(document.cookie="id="+escape("284 order by 10"));
(4)HTTP注入
三、获取SQL信息方式的不同
(1)报错注入
原理:利用数据库的某些机制,人为的创造错误条件,致使查询信息可以显示在报错信息中。
1》updatexml()函数:
作用:返回替代的xml片段
语法:UPDATEXML (XML_document, XPath_string, new_value);
原理:当updatexml参数错误时会报错
注入代码如下:
SELECT * FROM table_name WHERE id='and(select updatexml("anything",concat('~',(select语句())),"anything"))
2》extractvalue()函数:
作用:使用XPath表示法从XML字符串中提取值
语法:extractvalue(xml_document,Xpath_string)
原理:使用XPath表示法从XML字符串中提取值
注入代码如下:
SELECT * FROM table_name WHERE id='and(select extractvalue(1,concat(0x7e,(select database()))))
(2)延时注入
原理:延时注入又称时间盲注,也是盲注的一种。通过IF语句构造延时注入语句后,浏览器页面的响应时间来判断正确的数据。
场景:页面没有任何变化
相关函数:
substr(str,pos,len);从pos开始截取len个字符
length():MySQL中表示返回字符串所占的字节数,Oracle中表示字符串的长度(通常用来查询字符串长度)
assicll():将字符转换为ASCII码(在Oracle中chr()函数和ASCII()是一对反函数)
IF(a,b,c): 若a 条件为真返回b,为假返回c。
sleep(num):强制让语句停留num秒在返回。
mid(str,pos,num) :截取指定位置指定长度的字符串
注入方式:
判断库长度:select user from test where id=1 and if((length(database())=4),sleep(5),1);
库名:select user from test where id=1 and if((ascii(substr(database(),1,1))=116),sleep(5),1);
(3)布尔盲注
场景:页面返回的错误信息被屏蔽,只返回一个错误页面,不返回错误信息
原理:boolean注入就是系统屏蔽返回错误信息,只返回是或不是,所以我们不能直观的得到数据库信息,在这里,我们就只能通过boolean盲注进行注入。
常用函数:
ord():装换为ASCII码的值
注入方式:
?id=0' or ascii(substr(database(),1,1)) > 112 --+