cthub技能树_web_RCE之命令注入

[toc]

命令注入

image-20200730205313234

进入题目,题目中给出了源码:

image-20200730205758156

我们随便输入一个ip看看输出结果:

image-20200730205859577

可以看到返回了执行ping -c 4 127.0.0.1的结果。同时发现这个网页使用的是get请求:

image-20200730210440289

那如果我们可以让服务器不执行ping命令,而执行我们需要的命令让服务器将结果回显,不就相当于我们有了一个webshell吗!这就是命令注入的意思。我们可以通过管道符来实现。

linux支持多种管道符:

管道符用法
;执行完前面语句再执行后面的。如ping 127.0.0.1; ls
|显示后面语句的执行结果。如ping 127.0.0.1 | ls
||前面语句出错时执行后面语句。如ping 127.0.0.1 || ls
&前面语句为假则执行后面语句。如ping 127.0.0.1 & ls
&&前面语句为假则报错,为真则执行后面语句。如ping 127.0.0.1 && ls

我们使用 |进行注入,可以看到返回了ls的结果:

image-20200730210948859

我们看看那个奇怪的php文件,发现没有回显,看看源码(这个地方坑了我很长时间,后面的题最终都需要查看源码),得到flag:

image-20200730211234543

过滤cat

image-20200730211439573

对于命令注入的题目,主要考察的就是各种过滤的绕过,这道题就是考察cat过滤的绕过。

首先查看flag文件名:

image-20200730221846743

读取文件可以使用more、head等命令。关于linux的文本读取命令,可以看看这篇文章:Linux读取文本常用命令。本题我使用more命令,得到flag

image-20200730222246812

由于后面的题目均考察不同内容的过滤,所以非重点的图片等就不再放上来了。

过滤空格

这次我们要绕过空格,绕过空格有很多种方法。我们可以使用我们可以使用${IFS}来表示空格,IFS是shell中的一个变量,关于IFS的资料,可以看这篇文章(强烈推荐看看):详细解析Shell中的IFS变量

我们在命令中就用IFS来替换空格:

image-20200730223159084

得到flag:

image-20200730223441299

过滤目录分隔符

目录分隔符/我们可以使用$HOME代替,HOME也是shell中的一个环境变量,表示当前用户的根目录,我们可以看看当前用户的HOME值是什么

image-20200731173205285

可以看到当前用户的根目录是/home/www-data,我们只需要/,所以我们可以用${HOME:0:1}来实现

image-20200731181313922

首先查看flag位置:

image-20200731172616367

image-20200731172934380

读取flag:

image-20200731181418868

image-20200731181428086

过滤运算符

这道题过滤了 | 和 &,我们可以使用 ; 进行注入:

image-20200731181801768

直接cat得到flag:

image-20200731181837629

综合过滤练习

首先看一下过滤的符号有哪些:

image-20200731181939756

过滤了 | & ; 空格 / cat flag ctfhub这些符号

我们可以使用%0a(换行符的url编码)来绕过运算符:

image-20200731182638296

字符串的绕过我们可以使用反斜杠 \,如flag变成fl\ag:

image-20200731182804769

读取flag:

image-20200731183029022

image-20200731183037672

至此,我们就完成了命令注入的技能树,可以看到命令注入主要考察的就是各种绕过姿势,本文主要针对题目来讲,这里再放一些命令注入绕过姿势的总结文章,供大家参考和学习:

命令注入绕过姿势

命令执行绕过小技巧

命令注入绕过技巧总结

关于命令执行/注入 以及常见的一些绕过过滤的方法

ctfhub技能树_web_RCE之eval、文件包含

[toc]

这次我们来看看RCE(远程代码/命令执行)吧。由于篇幅限制,这篇文章不包含命令注入,命令注入我会在另一篇文章中详细的记录。

eval执行

image-20200730155557512

打开题目,可以看到网页的源代码

image-20200728222754175

通过代码可以看到,这就是典型的web后门,配置中国蚁剑

image-20200730153921884

进入后台,获取flag

image-20200730153821908

文件包含

image-20200728223933664

看看代码:

image-20200728223945677

strpos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置

参数描述
string必需。规定要搜索的字符串。
find必需。规定要查找的字符串。
start可选。规定在何处开始搜索。
返回值:返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
注释:字符串位置从 0 开始,不是从 1 开始。

可以看到如果get传入参数file的值开头为xflag(x为任意字符),则执行include()函数。

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

服务器后台有一句话木马shell.txt,因此我们的目标就是让服务器执行shell.txt中的语句。所以file的值为shell.txt

看看shell:

image-20200728224421429

则shell要传的参数是ctfhub:

image-20200730154818635

查找flag:

find / -name flag*

image-20200730154859368

得到flag:

image-20200730154918100

php://input

image-20200728230112933

首先看代码:

image-20200728230147871

可以看到如果get的参数file前六个字符为”php://“则执行include函数

看看phpinfo

image-20200728230338863

可以看到allow_url_include是On,说明可以使用php://input伪协议。

php://input 是个可以访问请求的原始数据的只读流。其实说白了它就是用来获取post内容的,但是其实只要你把内容写到请求包中,post和get都能获取。

那我们就通过这个伪协议和精心构造的请求包来获取我们想要的信息(注意此时虽然我是get请求而不是post,但由于我的包中有内容,所以伪协议依然是接收到了):

image-20200728231301739

这样我们就可以来找我们要的flag了

image-20200728231554765

有了flag的路径,就可以得到flag了。

image-20200728231744426

远程包含

image-20200728231924149

看代码:

image-20200728232001224

这个题的解法和上一题php://input一模一样,不再赘述。

image-20200728232316912

读取源代码

image-20200728232832725

代码审计:

image-20200728232902587

首先尝试php://input,发现没有返回结果

image-20200728233102208

测试了好多遍都无果,那看来是没法用input了。再看题目,题目告诉我们了flag的路径,于是我们可以用另一条伪指令php://filter来进行读取

php://filter是一种元封装器, 设计用于数据流打开时的筛选过滤应用。简单理解就是个可以读取数据的过滤器。我们可以用它选择想要进行操作并读取的内容。

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

名称描述
resource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表>任何没有以 read=write= 作前缀 的筛选器列表会视情况应用于读或写链。

关于php://filter更多的妙用可以看这个大佬的文章

知道了php://filter的用法,我们就可以读取flag了。

image-20200728232928462

关于伪协议部分,这里是官方的文档

至此,我们初步了解了文件包含和eval执行,解锁了对应的技能树,下一步,我们就来看看命令注入吧。

ctfhub技能树_web_web前置技能之http协议

[toc]

[begin]这[/begin]篇文章是ctfhub write up系列的第一篇,ctfhub这个平台在知名的ctf练习平台中算是相对比较基础的,我觉得它很好的一点是它的技能树由浅入深(只是除了web其他几乎都没几道题啊……),非常适合刚入门的ctfer。这个系列呢就来刷一下ctfhub技能树,wp也会按照技能树的节点来整理。当然,篇幅限制,这个系列不会详细的解释题目背后的基础原理。好了,废话不多说,让我们首先从web开始吧!

初见web,当然要了解web中常用的前置技能中最基础之HTTP协议。

请求方式

image-20200728214356549

打开题目,题目描述如下:

image-20200728214449865

让我们用CTF**B,这一猜就是CTFHUB嘛。(我不会告诉你我试了很多遍CTF**B)

burp抓包把报头的GET改成CTFHUB再发送,得到flag:

image-20200728214927838

302跳转

image-20200728215000780

打开题目

image-20200728215119561

点一下give me flag还是这个界面,题目提示我们302跳转,那点击按钮的时候用burp抓包看看:

image-20200728215219830

可以看到有一个“一闪而过”的302跳转界面,而这里就有我们要的flag

Cookie

image-20200728215341660

进入题目:

image-20200728215415635

所以我们要伪造admin身份,burp抓包看看:

image-20200728215513014

cookie的值本来是admin=0,我们改成1再请求下就可以得到flag

基础认证

image-20200728215735900

进入题目,点击按钮,发现让我们输入用户名和密码,注意验证中的“Do u know admin ?”

image-20200728215702867

题目中还有个附件,我们下下来看看,发现是个字典

image-20200728215909065

那看来让我们爆破了,题目中有“Do u know admin ?”,那我们就猜用户名是admin,用burp开始爆破吧,首先burp抓包看看(用户名随便填的wwww,密码随便填的ww):

image-20200728220401932

发现有base64加密,解密后发现是wwww:ww,那我们就知道了请求的格式了:“用户名:密码”。

准备爆破,注意设置规则,先添加前缀admin:,再进行base64加密得到payload,设置完成后用题目给的字典开始爆破。

image-20200728220822212

爆破结果:

image-20200728221049282

可以看到有一次的结果和其他结果返回的数据包长度不一样,打开响应包,得到flag

响应包源代码

image-20200728221211252

打开是个贪吃蛇游戏,不过我们不管他,看看网页的源码:

直接得到flag

至此,http协议的技能树我们就全解锁啦,继续向青草更青处漫溯吧!