HTTP请求头引发的注入问题 (SQL注入)
关于请求头中注入问题的演示,这里我写了一些测试案例,用来测试请求头中存在的问题。我们常见的会发生注入的点有 Referer、X-Forwarded-For、Cookie、X-Real-IP、Accept-Language、Authorization,User-Agent
HTTP Referer:是header的一部分,当浏览器请求网页时,会自动携带一个请求来源,如果后端存在交互,则会引发注入问题的产生。
User-Agent 请求头,该请求头携带的是用户浏览器的标识信息,如果此时带入数据库查询,则同样会触发注入问题的产生。
X-Forwarded-For:简称XFF头,它代表客户端,用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
Cookie:指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)
X-Real-IP:只记录真实发出请求的客户端IP。
Accept-Language:请求头允许客户端声明它可以理解的自然语言,以及优先选择的区域方言
HTTP_CLIENT_IP:该属性是PHP内置属性,同样取得的是客户端的IP,同样可控,如果带入数据库,则会产生注入问题。
Cookie 注入: 该注入的产生原因是因为程序员没有将COOKIE进行合法化检测,并将其代入到了数据库中查询了且查询变量是可控的,当用户登录成功后会产生COOKIE,每次页面刷新后端都会拿着这个COOKIE带入数据库查找,这是非常危险的.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf8">
</head>
<body>
<form action="" method="post">
账号: <input type="text" name="uname" value=""/><br>
密码: <input type="password" name="passwd" value=""/>
<input type="submit" name="submit" value="Submit" />
</form>
<?php
header("Content-type: text/html;charset=utf8");
error_reporting(0);
$connect = mysqli_connect("localhost","root","12345678","lyshark");
if($connect)
{
$cookee = $_COOKIE['uname'];
if($cookee)
{
$sql="SELECT username,password FROM local_user WHERE username='$cookee' LIMIT 0,1";
$query = mysqli_query($connect,$sql);
echo "执行SQL: " . $sql . "<br>";
if($query)
{
$row = mysqli_fetch_array($query);
if($row)
{
echo "<br> COOKIE 已登录 <br>";
echo "您的账号: " . $row['username'] . "<br>";
echo "您的密码: " . $row['password'] . "<br>";
}
}
}
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
$passwd = md5($passwd);
$sql="select username,password FROM local_user WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$query = mysqli_query($connect,$sql);
if($query)
{
$row = mysqli_fetch_array($query);
$cookee = $row['username'];
if($row)
{
setcookie('uname', $cookee, time() + 3600);
$format = 'D d M Y - H:i:s';
$timestamp = time() + 3600;
echo "COOKIE已设置: " . date($format, $timestamp);
}
}
}
}
?>
</body>
</html>
当登录成功后,再次刷新页面,就会将cookie带入数据中查询,此时观察cookie,可以闭合,则就会产生注入问题。
执行payload Cookie: uname=admin' and 0 union select database(),2--+
可爆出数据库名称。
查询数据库同样可以爆出,数据库的版本号。
稍微修改一下代码,当代码中设置COOKIE的位置上增加了Base64编码后,该如何注入呢?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf8">
</head>
<body>
<form action="" method="post">
账号: <input type="text" name="uname" value=""/><br>
密码: <input type="password" name="passwd" value=""/>
<input type="submit" name="submit" value="Submit" />
</form>
<?php
header("Content-type: text/html;charset=utf8");
error_reporting(0);
$connect = mysqli_connect("localhost","root","12345678","lyshark");
if($connect)
{
$cookee = base64_decode($_COOKIE['uname']);
if($cookee)
{
$sql="SELECT username,password FROM local_user WHERE username='$cookee' LIMIT 0,1";
$query = mysqli_query($connect,$sql);
echo "执行SQL: " . $sql . "<br>";
if($query)
{
$row = mysqli_fetch_array($query);
if($row)
{
echo "<br> COOKIE 已登录 <br>";
echo "您的账号: " . $row['username'] . "<br>";
echo "您的密码: " . $row['password'] . "<br>";
}
}
}
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
$passwd = md5($passwd);
$sql="select username,password FROM local_user WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$query = mysqli_query($connect,$sql);
if($query)
{
$row = mysqli_fetch_array($query);
$cookee = $row['username'];
if($row)
{
setcookie('uname', base64_encode($cookee), time() + 3600);
$format = 'D d M Y - H:i:s';
$timestamp = time() + 3600;
echo "COOKIE已设置: " . date($format, $timestamp);
}
}
}
}
?>
</body>
</html>
直接将Payload加密在线https://base64.us/
加密后,放入COOKIE中
Cookie: uname=admin' and 0 union select database(),2--+
Cookie: uname=YWRtaW4nIGFuZCAwIHVuaW9uIHNlbGVjdCBkYXRhYmFzZSgpLDItLSs=
Usage-Agent 注入问题: Usagen-Agent是客户请求时携带的请求头,该头部是客户端可控,如果有带入数据库的相关操作,则可能会产生SQL注入问题.
create table User_Agent(u_name varchar(20),u_addr varchar(20),u_agent varchar(256));
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf8">
<title>SQL 注入测试代码</title>
</head>
<body>
<form action="" method="post">
账号: <input style="width:1000px;height:20px;" type="text" name="uname" value=""/><br>
密码: <input style="width:1000px;height:20px;" type="password" name="passwd" value=""/>
<input type="submit" name="submit" value="Submit" />
</form>
<?php
header("Content-type: text/html;charset=utf8");
error_reporting(0);
$connect = mysqli_connect("localhost","root","12345678","lyshark");
if($connect)
{
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
$uname=$_POST['uname'];
$passwd=$_POST['passwd'];
$passwd = md5($passwd);
$sql="select username,password FROM local_user WHERE username='$uname' and password='$passwd' LIMIT 0,1";
$query = mysqli_query($connect,$sql);
if($query)
{
$row = mysqli_fetch_array($query);
if($row)
{
// 获取到用户的Agent客户请求体
$Uagent = $_SERVER['HTTP_USER_AGENT'];
// REMOTE_ADDR 是调用的底层的会话ip地址,理论上是不可以伪造的
$IP = $_SERVER['REMOTE_ADDR'];
echo "<br>欢迎用户: {$row['username']} 密码: {$row['password']} <br><br>";
echo "您的IP地址是: {$IP} <br>";
$insert_sql = "insert into User_Agent(u_name,u_addr,u_agent) values('$uname','$IP','$Uagent')";
mysqli_query($connect,$insert_sql);
echo "User_Agent请求头: {$Uagent} <br>";
}
}
}
}
?>
</body>
</html>
登录成功后,才可以显示你的客户端数据,也就是先要完成登录。
登录成功后,会自动获取客户端的user_agent信息,HTTP_USER_AGENT 属性对我们来说可控,且通过insert语句带入到了数据库,此时我们可以构建注入语句。首先我们通过burp提交登录请求。
然后再登陆成功后,我们继续增加注入语句,将其写道user-agent上完成报错注入。
修改agent验证,可被绕过,此处的语句带入数据库变为了insert into User_Agent values('1)','u_addr','u_agent')
有时,不存在回显的地方即使存在注入也无法得到结果.,但却是一个安全隐患,需要引起重视.
IP来路引发的注入问题: 这里我又写了一段代码,看似没有任何注入问题,原因是目标主机IP地址是可控的。
<?php
function GetIP(){
static $retIP;
if(isset($_SERVER)){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$retIP = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else if(isset($_SERVER['HTTP_CLIENT_IP'])){
$retIP = $_SERVER['HTTP_CLIENT_IP'];
}else{
$retIP = $_SERVER['REMOTE_ADDR'];
}
}
return $retIP;
}
$connect = mysqli_connect("127.0.0.1","root","123","lyshark");
if($connect)
{
$addr = GetIP();
$sql = "select * from ip where address='$addr' limit 0,1";
$query = mysqli_query($connect,$sql);
$row = mysqli_fetch_array($query);
echo '本机IP:' . $row['address'];
if ($row['address'] == $addr)
{
echo "注册过了..";
}
}
?>
<?php echo '<hr><b> 后端执行SQL语句: </b>' . $sql;?>
HTTP请求头引发的注入问题 (SQL注入)的更多相关文章
- XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式
SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...
- False注入,以及SQL注入技巧总结
title: False注入,以及SQL注入技巧总结 date: 2017-04-25 00:23:31 tags: ['SQL注入'] --- 利用False我们可以绕过一些特定的WAF以及一些未来 ...
- 注入攻击-SQL注入和代码注入
注入攻击 OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险.实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功.虽然这是最明显的组合关系,但是注入攻击带来的不仅 ...
- 注入攻击(SQL注入)
注入攻击是web安全领域中一种最为常见的攻击方式.注入攻击的本质,就是把用户输入的数据当做代码执行.这里有两个关键条件,第一是用户能够控制输入,第二个就是原本程序要执行的代码,将用户输入的数据进行了拼 ...
- 最新SQL手工注入语句&SQL注入大全
看看下面的1.判断是否有注入;and 1=1;and 1=2 2.初步判断是否是mssql;and user>0 3.判断数据库系统;and (select count(*) from syso ...
- SQL注入 (1) SQL注入类型介绍
SQL注入 SQL注入介绍与分类 1. 什么是sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 2. sql注入类型 按照注入 ...
- 注入攻击(SQL注入防御)
正确的防御SQL注入 sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全. 例如 mysql_real_escape_string()函 ...
- 常见sql注入的类型
这里只讲解sql注入漏洞的基本类型,代码分析将放在另外一篇帖子讲解 目录 最基础的注入-union注入攻击 Boolean注入攻击-布尔盲注 报错注入攻击 时间注入攻击-时间盲注 堆叠查询注入攻击 二 ...
- 从orderby引发的SQL注入问题的思考
背景: 某一天准备上线,合完master之后准备发布了,忽然公司的代码安全监测提示了可能在代码中存在sql注入的风险,遂即检查,发现sql注入问题 既然碰到了这个问题,那就了简单了解下sql注入 基础 ...
- web前端安全 XSS跨站脚本 CSRF跨站请求伪造 SQL注入
web安全,从前端做起,总结下web前端安全的几种技术: 1,XSS XSS的全称是Cross Site Scripting,意思是跨站脚本,XSS的原理也就是往HTML中注入脚本,HTML指定了脚本 ...
随机推荐
- 【Git】git多分支开发 git远程仓库 ssh链接远程仓库 协同开发 冲突解决 线上分支合并 pycharm操作git 远程仓库回滚
目录 昨日回顾 1 git多分支开发 分支操作 合并分支 2 git远程仓库 2.1 把路飞项目传到远程仓库(非空的) 3 ssh链接远程仓库,协同开发 4 协同开发 5 冲突解决 5.1 多人同一分 ...
- 使用触发器和C#程序实现数据同步
项目中用到了Quartz,也算是Quartz的一个示例. 源库创建数据同步表SYNC_DATA: CREATE TABLE SYNC_DATA( ID VARCHAR2(36) NOT NULL, T ...
- Java kafka 设置从指定时间戳开始消费
包含的功能: 1.Java kafka 设置从指定时间戳开始消费 2.JdbcTemplate操作MySql 3.Java多线程消费kafka 4.Java获取kafka所有topic pom.xml ...
- SpringBoot 项目实战 | 瑞吉外卖 Day06
该系列将记录一份完整的实战项目的完成过程,该篇属于第六天 案例来自B站黑马程序员Java项目实战<瑞吉外卖>,请结合课程资料阅读以下内容 该篇我们将完成以下内容: 用户地址簿相关功能 菜品 ...
- uni-app 预览pdf文件
安卓uni-app实现pdf文件预览功能: 1.https://mozilla.github.io/pdf.js/getting_started/#download下载 放在根目录下, 2.新建一个w ...
- B3637-DP【橙】
这题我用sort的时候大意了,从1开始使用的下标但是用sort时没加1导致排序错误,排了半天错才发现. 另外,这道题我似乎用了一种与网络上搜到了做法截然不同的自己的瞎想出来的做法,我的这个做法需要n^ ...
- freeswitch的2833和inband对接方案
概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...
- Redis 集群模式搭建
本文为博主原创,未经允许不得转载: 目录: 1. 哨兵模式与集群模式对比 2. Redis 集群架构搭建 3. 集群原理分析 4. 集群元数据维护方式对比 5. redis 分布式寻址 6. 集群选举 ...
- java: 程序包xxx.xxx.xxx不存在
1.问题 在拷贝进来一个文件夹/文件进入项目后,发生报错:java: 程序包com.itheima.mp.domain.query不存在 2.解决 这里主要是由于我们的文件直接拷贝进来,导致编译的时候 ...
- PS去除PDF中的WPS 编辑试用水印
1. 问题 自己的学习资料.pdf被添加上了相关水印,导致阅读起来很不舒服 2. 解决方式(适用于白底黑字的pdf资料,去除水印) 2.1 初始图片如下: 2.2 打开PS,选择菜单栏中选择一项中的色 ...