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