标题: [wargames] Natas 11 解答 分类: 安全测试 创建: 2022-12-01 23:53 修改: 链接: http://0x2531.tech/testing/202212012353.txt -------------------------------------------------------------------------------- OverTheWire 设计了一系列 wargames,Natas 是其中之一,主要关注基本的服务端 Web 安全问题。 最近抽空玩了下,还挺有趣。 Natas 项目地址:https://overthewire.org/wargames/natas/ Natas 11 主要考察代码审计方面的能力,具体知识点是逻辑异或 XOR 加解密。 主要的后端代码如下: "no", "bgcolor"=>"#ffffff"); function xor_encrypt($in) { $key = ''; $text = $in; $outText = ''; // Iterate through each character for($i=0;$i

natas11

Cookies are protected with XOR encryption


"; } ?>
Background color:
大致流程是:前台提交表单至后台脚本,脚本主要执行2个函数。第1个函数是 loadData,解码 cookie 中的 data 值,是否含 showpassword 和 bgcolor,默认情况下 showpassword=no,不显示密码; 第2个函数是 saveData,对 loadData 返回的数据重新编码后写入 cookie。当 showpassword=yes 时,在页面打印出 natas12 的密码。 所以,我们要做的是获取将 array( "showpassword"=>"yes", "bgcolor"=>"#ffffff") 经过 json_encode->xor_encrypt->base64_encode 一系列处理后的 data 值,然后将其写入 cookie 去请求后台脚本。 注意到这里的 xor_encrypt 函数,其通过逻辑异或使用加密 key 将明文文本加密为密文文本。遗憾的是 ,我们不知道这个 key 是什么,所以需要根据默认明文文本和密文文本,推导出 key 的值。 XOR 有个特性,任意对其中2个元素做异或计算,将得到第3个元素,这里的元素指代明文文本、加密 key 和密文文本。知道了这个特性,我们就可以写函数推导出加密 key 了。 string(41) "KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLK" 还需注意,默认的 showpassword=no 改成 yes 后,长度变长了,相应的明文和密文也会变长,密文也 会变长,所以需要追加几个 KNHL 才能得到正确的 data。 $data = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); function xor_encrypt($in) { $key = 'KNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHLKNHL'; $text = $in; $outText = ''; // Iterate through each character for($i=0;$i