Loading

lottery+web2

lottery

题目分析

题目给了一个彩票网站,经过页面的探索,没有发现明显漏洞,进行目录扫描,发现该站存在.git文件

lottery_2

猜测存在源码泄露,使用githack利用:

lottery_1

获得网页源码,进行源码分析

源码审计

// api.php
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;
		······
	}
	$money += $prize - 2;
	$_SESSION['money'] = $money;
	response(['status'=>'ok','numbers'=>$numbers, 'win_numbers'=>$win_numbers, 'money'=>$money, 'prize'=>$prize]);
}

这个函数使用==进行数字判断,而php==是弱类型判断,存在许多漏洞,不建议使用:

var_dump('123fg456'==123);		// true
var_dump('some string' == 0);	// true
var_dump(123.0 == '123d456');	// true
var_dump(0 == "a");				// true
var_dump("1" == "01");			// true
var_dump("1" == "1e0");			// true

如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。

特别注意,字符串转换为整数时,是从左到右,直到遇到非数字字符为止。也就是说 '123abc456' 会被转换成 123,而不是 123456。另外字符串开始的空格会被忽略,比如 ' 234abc' 转换为 234。

lottery_3

lottery_4

进行位检查的时候我们直接构建出[true,true,true,true,true,true,true]进行比较,有0的时候还是会出现问题,但是多请求几次就够钱购买flag了。

lottery_5

web2 解密

<?php 
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"; 

function encode($str){ 
    $_o=strrev($str); 
    // echo $_o; 
         
    for($_0=0;$_0<strlen($_o);$_0++){ 
        
        $_c=substr($_o,$_0,1); 
        $__=ord($_c)+1; 
        $_c=chr($__); 
        $_=$_.$_c;    
    }  
    return str_rot13(strrev(base64_encode($_))); 
} 

highlight_file(__FILE__); 
/* 
   逆向加密算法,解密$miwen就是flag 
*/ 
?> 

题目描述很简单,直接根据加密函数,写出相应的解密函数即可。

python脚本如下:

#!/usr/bin/python3
import base64

def rot13(s, OffSet=13):
     def encodeCh(ch):
         f=lambda x: chr((ord(ch)-x+OffSet) % 26 + x)
         return f(97) if ch.islower() else (f(65) if ch.isupper() else ch)
     return ''.join(encodeCh(c) for c in s)


def main():
    miwen = "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws"
    flag = ""
    miwen = rot13(miwen)
    miwen = miwen[::-1]
    miwen = base64.b64decode(miwen)
    miwen = miwen.decode('utf-8')
    for i in range(0, len(miwen)):
        flag += chr(ord(miwen[i]) - 1)
    print(flag[::-1])


if __name__ == "__main__":
    main()
posted @ 2020-03-30 21:34  chalan630  阅读(119)  评论(0编辑  收藏  举报