DVWA实战篇-sql injection(工具篇)
SQL Injection(SQL注入)
一.漏洞描述
当应用程序使用输入内容来构造动态SQL语句以访问数据库时,如果对输入的参数没有进行严格的过滤或者过滤不完整将会导致SQL注入攻击的产生。恶意用户通过构造特殊的SQL查询语句把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。从而可以获取到数据库的相关信息,包括数据库账号密码信息,甚至可上传木马,从而控制服务器。
二.漏洞验证
Low
1.输入1' or 1=2 # 判断发现存在注入点
2.使用sqlmap 直接探测,可以发现数据库的版本
3.使用sqlmap 探测数据库
4.使用sqlmap 跑当前数据库和表
5.使用sqlmap直接拖库到本地
Medium
提交方式变成post
Medium 在Low的基础上加了
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
1.使用sqlmap –r 读取请求头和form 直接探测数据库版本
2.直接加参数跑表名,拖库
High
加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。 LIMIT 1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。
如果id是索引的话,就不需要加上LIMIT 1,如果是根据主键查询一条记录也不需要LIMIT 1,主键也是索引。
1.发现提交页面和响应页面不在一个页面 使用—second-order +”响应URL”
2.使用sqlmap 直接+参数 拖库
三.漏洞进阶
-smart 启发式快速判断,节约时间
--sql-shell 执行指定sql命令 (寻找文件绝对路径)
--is-dba 查看当前注入点数据库权限是否为dba:True
--os-shell 获取系统交互shell
提权后,执行系统命令
创建用户名为789密码为789的用户
查看用户组,寻找管理员组
为789用户提权
检查用户
四.修复建议
- 建议使用统一的规则库对用户的所有输入进行安全性验证,验证不通过的应直接拒绝;
- 建议所有应用与数据库交互处均使用参数化查询,严禁将用户输入直接与SQL查询语句进行拼接;
- 对进入数据库的特殊字符('"\尖括号&*;等)进行转义或编码转换;
- 严格限制变量类型,数据库中的存储字段必须对应为int型;
- 数据长度应该严格限制,这能在一定程度上防御比较长的SQL注入语句;
- 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过;
- 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害;避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。