在开始正文之前,请允许我用我小学语文水平的语言组织能力来介绍一下何为HTTP头部信息 众所周知,在请求web服务器过程中,会发送一个HTTP包,为应用层的数据包,在数据包中,有web服务器的IP地址,还有你请求的网站路径、文件,其他的就是你(用户)的数据,具体有什么看WEB需要你给什么,一般来说有以下内容
具体数据包长什么样可以看下图
那么正题开始,解释了什么是HTTP包后,下面的内容应该不算是什么难以理解的内容,HTTP包有一个部分,叫做头部信息(heards),也就是上面提到的User-Agent这些,在有的环境中,php可能会将这部分的部分内容放到sql查询语句中配合使用,若是这部分没有加防范,那么就可以通过伪造headers头部信息来完成注入
HTTP头部注入我稍微的分了两个类 第一类为通过构造会记录下来验证身份的如X-FORWARDED-FOR这类来绕过/查询 第二类为构造用户使用的应用程序的信息和用户的IP地址这类来绕过/查询
--------分割线--------
下面是一条php中的sql查询语句
$useripaddr=$_SERVER['HTTP_X_FORWARDED_FOR']
$req=mysql_query("select user,password from users where user=’$username’ and password=’$password’ and get_ip=’$useripaddr’);
上面这个php代码,假如xff内容没有做防护的话,就会导致get_ip这一部分被恶意利用 只需要通过将x-forwarded-for内容更改、构造sql语句就好了 例如heards中,X_FORWARDED_FOR :127.0.0.1′ or 1=1# 这样一来,sql查询语句就变成了
select user,password from users where user=’$username’ and password=’$password’ and get_ip=’127.0.0.1' or 1=1#’
第一个PHP名为login.php,用于验证登录信息后返回cookie值 第二个PHP名为value.php,用于输出什么无关紧要的内容
在login.php中,有这么一个操作,若是验证过了用户名密码后,生成一个cookie,然后发送给value.php用户身份验证
生成用户cookie值
setcookie('ant[uname]',$_POST['username'],time()+36000);
setcookie('ant[password]',sha1(md5($_POST['password'])),time()+36000);
Value.php中,有这么一串代码用于查看是否有用户登录的cookie存在
$user_cookie=connect(); #接收login.php发送过来的cookie
$exist_user=check_sqli_login($user_cookie); #验证内容
if(!$exist_user){ #若没有cookie存在,则跳转到上一个登录界面中
header("location: login.php");
}
这类环境在进行查询或者写入操作时,会先判断你这个用户是否存在于数据库中,若存在,那么才会执行后面查询、写入这些操作
这种方法构造起来就更简单了,你只需要抓取一个登录成功的包,然后将用户名修改为sql注入语句 如 uname=admin 改为 uname=admin’ or 1=1# 这样sql语句就会被恶意注入成
select uname,password from users where username='admin'or 1=1#' and password='xxxxx';
于是就可以绕过了(这里是不正确示范,若真想万能密码绕过得输入一个不存在的用户名使其查询结果到or 1=1那边后得到结果为true就好了)
"头部注入秀就秀在他乱七八糟的"