lottery

题目分析

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

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

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

源码审计

// 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。

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

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()

最新文章

  1. SpringMVC入门
  2. “XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。
  3. LoadRunner测试结果分析01 转载至zhangzhe的新浪博客
  4. 自话自说——POI使用需要注意一个地方
  5. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql
  6. sublime设置备份
  7. Linux学习之查看远端的端口是否通畅
  8. 【Socket】Java Socket基础编程
  9. BST讲解
  10. day18 python之re模块与正则表达式
  11. spring-boot-2.0.3启动源码篇三 - run方法(二)之prepareEnvironment
  12. jsonify
  13. 12章 搜索框架ElasticSearch介绍和整合SpringBoot 4节课
  14. 【分库、分表】MySQL分库分表方案
  15. java class遍历属性
  16. mac 安装 pecl
  17. centos ssh远程登陆
  18. mysql-5.7.12-winx64安装版配置、使用
  19. ios APP 在 waiting for review时重新上传程序
  20. LeetCode第[46]题(Java):Permutations(求所有全排列) 含扩展——第[47]题Permutations 2

热门文章

  1. [TopCoder]Seatfriends
  2. HTML中doctype的作用及几种类型详解
  3. C++核心编程
  4. 在Java虚拟机上班是一种怎样的体验?
  5. Java架构师如何学习?
  6. Spring 中Controller 获取请求参数的方法笔记
  7. 黎活明8天快速掌握android视频教程--16_采用SharedPreferences保存用户偏好设置参数
  8. 入门大数据---Kafka消费者详解
  9. vs code 初始化vue项目框架
  10. Laravel 如何在blade文件中使用Vue组件