DVWA靶场通关记录(SQL注入)

文章详细描述了SQL注入的低、中、高三个难度级别的攻防过程,通过手动和工具(BurpSuite)进行注入测试,展示了如何通过注入获取数据库信息,以及如何在不同防护级别下调整策略。在Impossible级别,提到了PDO防护技术对SQL注入的有效防御。
摘要由CSDN通过智能技术生成

  Low

 首先,判断注入类型,输入一个单引号试试

df1a168d2c5e4bae88253be4bc1f2da0.png

0d1289a954cf4da298bd226e3c307e65.png

单引号报错,判断为字符型注入。

然后,输入1' or 1=1#万能公式来绕过提交,取得所有用户基本信息:

cc50e93696794a7c9fed3c8fe5ede426.png

可以看到总共有五条用户信息。

第三步,分别输入1'order by 1#1'order by 2#1'order by 3#来测试字段数

52cdb3c82c56458aad4b64e537c88c3b.png

 正好测试到3时网页报错,这说明查询字段语句超出了字段范围,也就是说,只有2个字段。

查看一下源码,果然是两个字段

d646b250629645f9b8cb57fbba939a20.png

 分别是first_name和last_name。

这时候我们需要知道MySQL数据库的几个默认数据库,方便我们进行数据爆出。

在MySQL中,自带的库为information_schema,其中包含MySQL中所有的数据库信息,包括所有库名、表名和列名。可以通过这个自带库获取信息。其中的表tables存储表名,表columns存储列名,通过句点“.”来连接上下级关系,例如:information_schema.tables。使用database()语句可以查询当前所在的数据库名称,user()可以查询当前登录的用户名。

输入1' union select 1,database()#联合查询语句,这里的子查询要与主查询的字段数一致,前面测试出字段数为2,所以子查询数目也要为2,因此子查询的第一个字段随便一个数字就都行,第二个就查询我们当前的库名。

在此之前,先输入1' union select database(),user()#查出当前用户名

2ef2a0865a0c41ecb756d92c81bb3a41.png

0bc8a476b8f1467ea8956180ce25a55e.png

可以看出,我这里的库名为root,用户为root@localhost。

接下输入1' union select table_name,table_schema from information_schema.tables where table_schema='root'#爆表,这条语句的执行的是,从information_schema库中的tables表中,查找所属数据库名为“root”的所有表。换句话说,就是把root数据库中所有的表找出来。

554af2339682444793044f60a353f2af.png

可见root库中有两个表,分别为guestbook和users。

据此可以猜测用户敏感信息都在users表中。那么接下来爆列。输入1' union select column_name,table_schema from information_schema.columns where table_name='users'#

42ab1bb5a85f496d9955c0a6357c2d16.png

 这条语句意思是,在information_schema的columns表中,找出表名为users的所有的列名及其所在的数据库名。

现在所有在users表中的列都出来了。可知,password和user存放的密码和用户名。

输入1' union select user,password from users#

69aac09eefce4949bfee6a3101e4119b.png

 在users表中查询出password和user的内容,所有用户信息就爆出来了。

密码是MD5格式加密的,拿去解码就可以得到密码明文。

一次简单的SQL手工注入就完成了。

Medium

将难度切换到中等,发现有变化了

c0d0ec55db2e4e71a39cf786bedc6dcc.png

没有输入栏表单,取而代之的是下拉选项框,目的就是防止手动注入。

这时候就应该派工具上场了——burpsuite。关于burpsuite的下载安装配置和使用这里就不多赘述了,大家可以自己去了解相关知识,这里我们的目的是靶场训练。

打开bp,连接靶场,先点击提交抓个包

6005b8e7cf37416aa1ed72068a894c9f.png

可以看出提交的数据被抓取了,显示在http报文中。这里我们就可以进行巧妙地绕过,拦截抓包,改包之后再提交。

26c42d8b37404f95b117150609cecb34.png

这里有一点要注意的是,源代码中有一段
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); 会过滤掉特殊字符 “ ' ”,“\n”,“\r”等。所以输入的单引号会被过滤掉。这是一个小小的陷阱。

判断注入类型,输入单引号引发报错,数字型注入成功

d02cc01f6787434181277fc053546f60.png

 测试字段数和low级别一样,这里就不放图了。

737ca65dd311487e935ddbc1786f8884.png

 这里要注意,因为上面说的转换函数的原因,我们需要把引号内的词进行十六进制转换。

也就是‘root’换成0x726f6f74,‘users’换成0x7573657273。

而爆表爆列爆数据的命令和low级别的一样,只是进行了进制转换

768bd66db80e4e03b42f28e48499d461.png

 590ea158b63547ad9b7170c24308d2a3.png

 db81ef622fee41a98396b113b4dcba2e.png

一样的流程,最后拿到数据

那么,用burpsuite工具进行的简单绕过SQL注入就完成了。

High

难度再度提升,这回是在另一个页面进行注入。

这个难度其实目的是给sqlmap自动注入增加难度,但是手工注入的话还是按步骤来就行。

52f9367aaaee4047b16cb919d5984dd1.png

点开链接。到了注入页面。

上万能密码

91c5e25b16754a6d8479beeff77f1918.png

照样管用。按着之前的一套的流程照打

bb68835b6fd74b40ba8d739fce34cd0f.png

 爆表爆列

4592370b02ba45b7bd479bd46401a45a.png

 2f4904875c024dd4811c2774ebea3ecb.png

 cc936fb40b8d4919a8ef7624c1c787ee.png

 数据照拿,只是单独开了一个注入页面。

那么,high级别的sql注入也完成了,这个级别主要是防止sqlmap工具,同时在源代码中有一条limit 1来限制输出为一条,而我们已经用#把后面都注释掉了,所以这个limit也就不起作用了。

Impossible

impossible级别,当然就是无法被攻破的。这个级别是用来给开发人员和安全团队研究如何预防安全漏洞。我们来看源代码。

06a2595fc077444a9c2f398e1fa0a8c9.png

通过查找资料,了解到这是PDO防护技术。

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。

PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。

这里将数据和指令的输出分开来,有效防御了SQL注入攻击。 有兴趣的读者可以自行查阅相关资料了解更多。

DVWA靶场的SQL注入部分的通关记录结束,欢迎交流与反馈。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值