http://120.24.86.145:8004/index1.php
flag In the variable !
error_reporting(0); // 关闭php错误显示
include "flag1.php"; // 引入flag1.php文件代码
highlight_file(__file__); //对文件进行语法高亮显示
if(isset($_GET['args'])){ // 条件判断 get方法传递的args参数是否存在
$args = $_GET['args']; //赋值给变量 $args
if(!preg_match("/^\w+$/",$args)){ // /^开始, \w表示任意一个单词字符,即[a-zA-Z0-9_] ,+将前面的字符匹配一次或多次,$/结尾
die("args error!"); //输出 args error!
}
eval("var_dump($$args);"); // 将字符串作为php代码执行结尾加分号 var_dump()函数 显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。$$args 可以理解为$($args)
}
?>
php中超全局变量 $GLOBALS ,PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
构建
?args=GLOBALS
最后补充一点 很多人都认为$GLOBALS[]、global只是写法上面的差别,其实不然。
前者为变量实体 后者为别名引用
eg:
$var1 = 1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
?>
因为$var1被删除了,所以什么东西都没有打印。
$var1 = 1;
function test(){
global $var1;
unset($var1);
}
test();
echo $var1;
?>
意外的打印了1。
证明删除的只是别名,$GLOBALS[‘var’]的引用,起本身的值没有受到任何的改变。
验证了我们之前所说的东西
也就是说global v a r 其 实 就 是 var其实就是 var其实就是var = &$GLOBALS[‘var’]。调用外部变量的一个别名而已。
提示jsfuck
在代码中看到jsfuck
放到控制台加回车
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNFX1f4G-1590199344227)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200502204547641.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7cZWLD1-1590199344230)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200502204831557.png)]
打开什么也没有
用bp抓包
send to repeater
go
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjWVZqRA-1590199344235)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200505130546609.png)]
base64解码后就发现flag
开御剑扫后台
尝试admin等弱密码无效后
开burp进行爆破,这里选择Simple list,字典选择burp自带的Passwords
sendtointruder
爆破成功,密码是hack
登录后flag出现
提交后显示ip被记录,吓一跳
查看源码发现最后有一段base64编码,转换为test123,猜测是密码
提交了还不对
brup抓包,添加X-Forwarded-For头
它代表客户端,也就是HTTP的请求端真实的IP
X-Forwarded-For:127.0.0.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MC8r8fNY-1590199344239)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200503161308343.png)]
查看源码发现
<script>
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));
script>
url解码后
var p1 = 'function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b';
var p2 = 'aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").οnsubmit=checkSubmit;';
eval(unescape(p1) + unescape('54aa2' + p2));
function checkSubmit(){
var a=document.getElementById("password");
//获取ID名为password的文档元素,并赋给a
if("undefined"!=typeof a){
//判断a的类型是否undefined
if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)
//判断:a元素的value值是否为67d709b2b54aa2aa648cf6e87a7114f1
return!0;
alert("Error");
//弹框:Error
a.focus();
//获得焦点时,改变背景颜色
return!1
}
}
document.getElementById("levelQuest").onsubmit=checkSubmit;
//获取ID值为levelQuest的文档元素,点击submit时执行checksubmit函数
//onsubmit:再点击submit时发生,若返回真提交表单
输入
得到flag
——原文链接:https://blog.csdn.net/zpy1998zpy/article/details/80585443
这道题目里有经典的本地文件包含漏洞+php伪协议的结合应用
注意到url地址 http://120.24.86.145:8005/post/index.php?file=show.php
这是一个典型的文件包含漏洞,(file关键字是提示,其实也是CTF的套路)。
这里用到了php的封装协议:http://php.net/manual/zh/wrappers.php.php
具体怎么用呢,先说结果:
http://120.24.86.145:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
现在具体说说
file=php://filter/read=convert.base64-encode/resource=index.php
的含义
首先这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是base64编码后,resource=index.php表示目标文件为index.php。
通过传递这个参数可以得到index.php的源码,下面说说为什么,看到源码中的include函数,这个表示从外部引入php文件并执行,如果执行不成功,就返回文件的源码。
而include的内容是由用户控制的,所以通过我们传递的file参数,是include()函数引入了index.php的base64编码格式,因为是base64编码格式,所以执行不成功,返回源码,所以我们得到了源码的base64格式,解码即可。
如果不进行base64编码传入,就会直接执行,而flag的信息在注释中,是得不到的。
我们再看一下源码中 存在对 …/ tp data input 的过滤,其实这都是php://协议中的其他方法,都可以结合文件包含漏洞执行
提示了爆破,五位数密码
那就bp爆破
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qKfTKRuY-1590199344242)(C:\Users\19674\AppData\Roaming\Typora\typora-user-images\image-20200505130128595.png)]
从10000-99999都是五位数,慢慢来嘛
最后爆出来flag,在response查看
g的信息在注释中,是得不到的。
我们再看一下源码中 存在对 …/ tp data input 的过滤,其实这都是php://协议中的其他方法,都可以结合文件包含漏洞执行
提示了爆破,五位数密码
那就bp爆破
[外链图片转存中…(img-qKfTKRuY-1590199344242)]
从10000-99999都是五位数,慢慢来嘛
最后爆出来flag,在response查看