Natas11:

页面提示cookie被异或加密保护,查看源码,发现了一个预定义参数和三个函数。

//预定义参数,猜测将showpassword设置为yes即可得到密码。
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); //异或加密函数
function xor_encrypt($in) {
$key = '<censored>'; //预定参数key
$text = $in; //输入参数
$outText = ''; //输出参数 // Iterate through each character
for($i=0;$i<strlen($text);$i++) { //for循环,遍历输入参数
$outText .= $text[$i] ^ $key[$i % strlen($key)]; //将输入参数对应位和key对应位异或,key位数不够则从头循环,结果存到输出参数
} return $outText; //返回加密结果
} //加载函数:将$_COOKIE["data"]解密还原,存为 $mydata 数组,返回$mydata。
function loadData($def) {
global $_COOKIE;
$mydata = $def;
if(array_key_exists("data", $_COOKIE)) {
$tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE["data"])), true);
if(is_array($tempdata) && array_key_exists("showpassword", $tempdata) && array_key_exists("bgcolor", $tempdata)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) {
$mydata['showpassword'] = $tempdata['showpassword'];
$mydata['bgcolor'] = $tempdata['bgcolor'];
}
}
}
return $mydata;
} //保存函数:将传入的参数,经过编码处理,存入$_COOKIE["data"]中。
function saveData($d) {
setcookie("data", base64_encode(xor_encrypt(json_encode($d))));
} $data = loadData($defaultdata); if(array_key_exists("bgcolor",$_REQUEST)) {
if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) {
$data['bgcolor'] = $_REQUEST['bgcolor'];
}
} saveData($data); //将showpassword设置为yes即可得到密码
if($data["showpassword"] == "yes") {
print "The password for natas12 is <censored><br>";
}

主要思路就是构造新的输入参数,使得"showpassword"=>"yes",编码后得到新的data。这就要求要知道key的值,而已有一个默认值,由此逆推得到key。

通过burp抓包,可以发现$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff")对应的data值为“ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=”。

我们知道,异或的逆操作还是异或。由此我们可以逆推得到key。$key = ’qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq’

<?php
$defaultdata = array( "showpassword"=>"no", "bgcolor"=>"#ffffff");
$data= 'ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw=';
function xor_encrypt($in,$out) {
$key ='' ;
$text = $in;
for($i=0;$i<strlen($text);$i++) {
$key .= $text[$i] ^ $out[$i];
}
return $key;
}
echo xor_encrypt(json_encode($defaultdata),base64_decode($data));
?>

再利用key,构造新data。新data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK

<?php
$defaultdata = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff");
function xor_encrypt($in) {
$key = 'qw8J';
$text = $in;
$outText = ''; // Iterate through each character
for($i=0;$i<strlen($text);$i++) {
$outText .= $text[$i] ^ $key[$i % strlen($key)];
}
return $outText;
}
echo base64_encode(xor_encrypt(json_encode($defaultdata)));
?>

将新的data替换cookie中的data,点击Go,得到flag。

flag:EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3

 
参考:https://www.cnblogs.com/ichunqiu/p/9554885.html

最新文章

  1. YII2-数据库数据查询方法,关联查询with, joinWith区别和分页
  2. 大话PHP缓存头
  3. day 2远程连接Linux系统管理
  4. 如何在 ie6 中使用 &quot;localStorage&quot;
  5. 转!!mybatis在xml文件中处理大于号小于号的方法
  6. 实现JavaScript的组成----BOM和DOM
  7. 使用UDP进行数据发送的实例一
  8. 文件I/O(不带缓冲)之open函数
  9. sqlserver 自定义字符串分割函数.
  10. Week6(10月17日):周末别忘记运动
  11. DOM处理
  12. box-shadow阴影详解
  13. 记Angular与Django REST框架的一次合作(2):前端组件化——Angular
  14. MSIL实用指南-加载bool、sbyte、byte、char、short等值
  15. Webpack模块的导出以及之间的依赖引用
  16. 插件开发之360 DroidPlugin源码分析(二)Hook机制
  17. teamviewer quicksupport 插件(下载)
  18. 外网访问内网MariaDB数据库
  19. Linux系统安装IonCube的方法详解教程
  20. 3-jsp 内置对象、转发与重定向

热门文章

  1. CodeFroces New Assignment 二分图匹配
  2. 修改npm安装的全局路径和配置环境变量
  3. 递归遍历磁盘下的某一文件夹中所有文件,并copy文件生成文件和带文件夹的文件
  4. Thomson Plaza里面的三家店以及水果大会
  5. STL容器的使用
  6. marquee用到的属性
  7. USB小白学习之路(1) Cypress固件架构解析
  8. 这么香的Chrome插件,你都安装了吗?
  9. (原)人体姿态识别PyraNet
  10. MySQL占用CPU超过百分之100解决过程