标题: [wargames] Natas 13 解答 分类: 安全测试 创建: 2022-12-03 14:53 修改: 链接: http://0x2531.tech/testing/202212031453.txt -------------------------------------------------------------------------------- OverTheWire 设计了一系列 wargames,Natas 是其中之一,主要关注基本的服务端 Web 安全问题。 最近抽空玩了下,还挺有趣。 Natas 项目地址:https://overthewire.org/wargames/natas/ Natas 13 主要考察代码审计方面的能力,具体知识点是绕过上传图片检测,在图片中写入脚本代码并能成 功执行。 主要的后端代码如下: ========== 1000) { echo "File is too big"; } else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) { echo "File is not an image"; } else { if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file $target_path has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; } } } else { ?>
Choose a JPEG to upload (max 1KB):

========== 关键代码逻辑是后台在处理图片前,会使用 exif_imagetype 函数检测是否为图片。 else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) { echo "File is not an image"; } 查看函数文档可知,exif_imagetype 函数通过读取图片的第一个字节和检查签名来判断是否为图片及是那 种类型的图片。事实上,每种图片格式都有其特定的数据格式。如以下为某个 PNG 图片格式的 hexdump: 00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR 00000010: 0000 0020 0000 0020 0803 0000 0044 a48a ... ... .....D.. 00000020: c600 0000 1974 4558 7453 6f66 7477 6172 .....tEXtSoftwar 00000030: 6500 4164 6f62 6520 496d 6167 6552 6561 e.Adobe ImageRea 00000040: 6479 71c9 653c 0000 000f 504c 5445 66cc dyq.e<....PLTEf. 00000050: ccff ffff 0000 0033 9966 99ff cc3e 4caf .......3.f...>L. 00000060: 1500 0000 6149 4441 5478 dadc 9331 0ec0 ....aIDATx...1.. 00000070: 200c 0393 98ff bfb9 3414 09d4 3a61 61a0 .......4...:aa. 00000080: 37b0 f824 0b0b 4413 44d5 026e c10a 47cc 7..$..D.D..n..G. 00000090: 05a1 e0a7 826f 1708 cfba 54a8 2130 1a6f .....o....T.!0.o 000000a0: 01f0 9356 b43c 107a 4d20 4cf9 b730 e444 ...V.<.zM L..0.D 000000b0: 4896 4422 4c43 eea9 38f6 c9d5 9b51 6ce5 H.D"LC..8....Ql. 000000c0: f326 5c02 0c00 d266 0335 b0d7 cb9a 0000 .&\....f.5...... 000000d0: 0000 4945 4e44 ae42 6082 ..IEND.B`. 前 8 个字节 89 50 4e 47 0d 0a 1a 0a 为 PNG 文件的文件头,每个正常 PNG 文件的前 8 个字节 都是如此。接下来的 IHDR、PLTE、tEXt 为图片数据块标识,数据块里存储真正的图片信息。最后,IEND 标识则表示数据流结束,必须放在文件末尾,正常 PNG 文件的最后 12 个字节为 00 00 00 00 49 45 4e 44 ae 42 60 82。 那么,可以拆分为如下2个子任务: 1. 准备一个正常的图片文件,并且其大小小于 1KB; 2. 在不破坏图片格式的前提下,向图片里写入代码成功执行后获取下一关的密码。 为了较好的完成任务,这里使用 jhead 工具往 JPEG 图片里写入脚本代码。 $ ./jhead -ce not_kitty.jpg 执行命令打开文本编辑器,输入如下代码,保存。 此时,PHP 代码已被写入 JPEG 注释部分,不会破坏图片数据结构。 00000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H 00000010: 0048 0000 fffe 0040 3c3f 7068 7020 7061 .H.....@....C.P7 Choose a JPEG to upload (max 1KB):

接着,用浏览器打开 html 上传 not_kitty.jpg,成功上传文件,并且被转为 php 文件。访问该 文件,得到 natas14 的密码。 ... JFIFHH..@=== qPazSJBmrmU7UQJv17MHk1PGC4DxZMEP ..CP7