从CTF题目中领悟的渗透技巧

简介: 本文讲的是从CTF题目中领悟的渗透技巧,本来个人不是很喜欢去做那些CTF题目,觉得无聊,还是比较喜欢实战一些,但是现在发现,有的CTF做起来可以获取到一些奇特的渗透技巧。这篇文章就是围绕着一道题目获取到的一些奇葩小思路。
本文讲的是 从CTF题目中领悟的渗透技巧

0x1 题目来源

本来个人不是很喜欢去做那些CTF题目,觉得无聊,还是比较喜欢实战一些,但是现在发现,有的CTF做起来可以获取到一些奇特的渗透技巧。这篇文章就是围绕着一道题目获取到的一些奇葩小思路。忘记在哪里看到的题目了,反正我记得题目的大概。就重新复现了一个出来,思路来源也是来自一个大牛的小密圈。感觉很好的思路,所以就分享出来,毕竟入小密圈是收费的嘛,知识应该共享的。

0x2 题目要求

题目大概的要求是这样的:

从CTF题目中领悟的渗透技巧

题目的代码是我重新写出来的,多少根原题有些不一样。但是大概差不多了。就是有一道`flag`存放在,`4hou.php`文件中,想办法读取这个文件,并取得`flag`。

0x3 题目复现

在想办法复现之前先来看看`4hou.php`文件中究竟有什么东西:

从CTF题目中领悟的渗透技巧

这就是存放在`4hou.php`文件中的内容。重新回到题目中,首先,看到`http://192.168.12.102/index.php?cmd=`这样的url相信大家在第一时间都会想到命令执行,没错的就是命令执行。先来输入一道命令来查看下他是什么情况,到底是怎么个意思。提交一个这样`http://192.168.12.102/index.php?cmd=cat `的链接,看看回显出来的是什么样子

从CTF题目中领悟的渗透技巧

发现回显中并没有空格,那肯定我们得自己家一个空格了,加上空`%20`提交

> http://192.168.12.102/index.php?cmd=cat%20

从CTF题目中领悟的渗透技巧

猜对了,加上一个空格成功被分割开了。这个是有有的同学就像说,把`cat`命令之前在加一个空格,那样`curl`命令也可以分割开了,分隔开是没有错了,但是有什么用?命令就执行了`curl cat 4hou.php`这样的一道命令,一样还是没有执行`cat`命令。

继续提交一堆参数,看看这个函数究竟过滤了什么。提交`http://192.168.12.102/index.php?cmd=/+-()*<>`,一堆有的没的,目的就是看这个参数过滤了什么

从CTF题目中领悟的渗透技巧

过滤了什么,没过滤什么一幕了然。

现在要想的就是如何让`curl` 不执行,但是要让`cat`命令执行。想想,怎么办?

使用`%0a`,这个`url`编码是换行符,曾经在sql注入的时候的时候,经常使用`%0a`字符来换行污染来进行注入的。那不妨来尝试一下,看看能不能在`curl`之后换行进行执行。提交`http://192.168.12.102/index.php?cmd=%0acat%20`

从CTF题目中领悟的渗透技巧

成功读出来了存放在`4hou.php`中的内容 ps:因为我不太会写php,代码的问题输出了两遍。

0x4 难度增加,不服继续

上面的代码没有过滤空格,现在,我在代码中过滤了空格。往下之前先自己想想,你还能过吗?

有了上面的测试结果,这一步就很容易实现了,空格过滤了,`%0a`该换行还得换行,这个是没有问题的,现在的问题是空格过滤了,怎么玩?

这里就需要一个小技巧了,linux下`<`,`>`这两个符号的妙用也是很重要的,对linux熟悉的同学,思路就有了,`>`这个符号是写入,`<`这个符号自然而然是读出了,

构造`payload`:`http://192.168.12.102/index.php?cmd=%0acat%3C`

从CTF题目中领悟的渗透技巧

过滤空格又何妨?一样可以想办法执行的!

0x5 任意代码执行?

过滤了一堆,那还有没有可能来构造任意代码执行?

标题都写这里了,当然有机会了!相信所有人在思考的问题都是空格怎么解?

在linux中,可是有代替空格的东西哦,比如`{IFS}` 。试一下

从CTF题目中领悟的渗透技巧

看,ok的,重新回到网站中尝试构造`payload`:`http://192.168.12.102/index.php?cmd=%0als${IFS}-a`

结果:

从CTF题目中领悟的渗透技巧

任意代码都没有问题了。都这样了,当然继续猥琐了,我们想看的文件无非就是`passwd`文件,但是`/`被过滤了,怎么绕过?

少年莫慌,咱们继续执行`env`命令,可以看到全部的环境变量提交:`http://192.168.12.102/index.php?cmd=%0aenv%3C`

从CTF题目中领悟的渗透技巧

因为解析的问题,是在没办法在web上跑了,不得不转向虚拟机(只是这里没有办法提取到环境变量而已,方法还是有的,往下看)

从CTF题目中领悟的渗透技巧

反正照样执行成功,就算他过滤的再凶,终究是有办法绕过的。只有想不到,没有骚不到。

0x6 其他骚操作

因为解析不了的原因,没的办法,只能用虚拟机演示了。

还可以使用base64加密绕过,终端下执行:

> echo Y2F0IC9ldGMvcGFzc3dk|base64 -d|bash

`Y2F0IC9ldGMvcGFzc3dk`加密之前为`cat /etc/passwd`

从CTF题目中领悟的渗透技巧

一样可以顺利执行代码。

修改代码,讲过滤条件修改

> array('>',''','','/',' ','<','(',')','|',':','_','@');

还有没有希望?

0x7蛇皮操作—最终章

这种操作真的是丧心病狂,只要你环境变量中有的字符,我无法调用算我输!

`expr`万能的神!比如说你看上了这个`:`

从CTF题目中领悟的渗透技巧

直接构造`expr${IFS}substr${IFS}$DISPLAY${IFS}1${IFS}1`

从CTF题目中领悟的渗透技巧

想要别的!

从CTF题目中领悟的渗透技巧

要什么有什么!

当然,这一切的一切都要构造在两个条件之上!:

– 没有过滤`$`,和`{`,`}`

– 环境变量中得有啊

有了以上的这个方法,我们在回到`0x5`,刚刚密码是没有读取成功的,重新构造一个,先来构造一个`/`,

使用`$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)`来代替`/`

`${IFS}`来代替空格,构造出来的`payload`如下

`http://192.168.250.227/index.php?cmd=%0acat${IFS}$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)etc$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)passwd%3C`

提交看结果

从CTF题目中领悟的渗透技巧

0x8总结

有了这个思路我又想到之前的《spring框架的任意代码执行》,之前并没有想到有这样的用法,那现在就再回头研究下吧。

测试代码

> ```
> <?php 
> $arr = array('>',''','','/',' ');              //这里要过滤什么加什么
> $a =isset($_GET['cmd']) ? $_GET['cmd'] : '';
> foreach ($arr as $v) {
> $a = str_replace($v,'',$a);
> }
> echo shell_exec("curl{$a}4hou.php");
> echo "<br />";
> echo "curl{$a}4hou.php";
> ?>
> ```



原文发布时间为:2017年6月26日
本文作者:smileTT
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
目录
相关文章
|
7月前
|
程序员
程序员思维在小学数学解题中的渗透
程序员思维在小学数学解题中的渗透
34 0
|
10月前
|
SQL 安全 Shell
CTF——常见题型
CTF——常见题型
152 0
|
10月前
|
机器学习/深度学习 人工智能 程序员
2023年 团体程序设计天梯赛个人感悟及总结(附题解)——遗憾国三
⭐L1一阶题 ⭐L1-089 最好的文档 (5分)—水题 👉👉👉👉👉👉L1-089 最好的文档👈👈👈👈👈👈 有一位软件工程师说过一句很有道理的话:“Good code is its own best documentation.”(好代码本身就是最好的文档)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一行中输出 Good code is its own best documentation.。 输入样例: 无 输出样例: Good code is its own best documentation.
654 0
|
10月前
|
芯片
2022年 团体程序设计天梯赛——题解集(1)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-081 今天我要赢 (5分)——水题 本题题目链接!!!!! 2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。
291 0
|
10月前
|
程序员
2017年 团体程序设计天梯赛——题解集
⭐L1-038 新世界 (5分) 本题题目链接👈 👈 👈 👈 👈 这道超级简单的题目没有任何输入。 你只需要在第一行中输出程序员钦定名言“Hello World”,并且在第二行中输出更新版的“Hello New World”就可以了。
252 0
|
10月前
|
机器学习/深度学习
2018年 团体程序设计天梯赛——题解集
⭐L1-051 打折 (5分) 本题题目链接👈👈👈👈👈 去商场淘打折商品时,计算打折以后的价钱是件颇费脑子的事情。例如原价 ¥988,标明打 7 折,则折扣价应该是 ¥988 x 70% = ¥691.60。本题就请你写个程序替客户计算折扣价。 输入格式: 输入在一行中给出商品的原价(不超过1万元的正整数)和折扣(为[1, 9]区间内的整数),其间以空格分隔。 输出格式: 在一行中输出商品的折扣价,保留小数点后 2 位。
454 0
|
10月前
|
Linux 测试技术 容器
2020年 团体程序设计天梯赛——题解集(1)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-065 嫑废话上代码 (5分) 本题题目链接!!!!! Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。
161 0
|
10月前
|
前端开发 JavaScript 开发者
2016年 团体程序设计天梯赛——题解集
⭐ L1-028 判断素数 (10分) 本题题目链接 本题的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 31 的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。
197 0
|
10月前
|
小程序 Linux
2020年 团体程序设计天梯赛——题解集(2)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-065 嫑废话上代码 (5分) 本题题目链接!!!!! Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。
155 0
|
10月前
|
人工智能 算法 安全
2022年 团体程序设计天梯赛——题解集(2)
⭐L1一阶题 (虽然比较基础但是是很重要的一部分,且一些题目有一定难度哦!) ⭐L1-081 今天我要赢 (5分)——水题 本题题目链接!!!!! 2018 年我们曾经出过一题,是输出“2018 我们要赢”。今年是 2022 年,你要输出的句子变成了“我要赢!就在今天!”然后以比赛当天的日期落款。
228 0

相关实验场景

更多