给他 首先就是一个登陆框。没啥东西。然而并没有告诉我们参数 这里就有两种方法。一种。看下面sql语句。盲猜name和pass为列名 第二种。也是预期的解法。.git源码泄露。当你实在没思路的时候。不妨找找其他信息 用githack获得源码 在pwn和web中。都存在格式化字符串漏洞。主要是因为代码不严谨
<?php $pass=sprintf("and pass='%s'",addslashes($_GET['pass'])); $sql=sprintf("select * from user where name='%s' $pass",addslashes($_GET['name'])); ?>
善用搜索引擎。sprintf函数。是将字符串格式化写入 sprintf('and pass=%s','test') %s代表此处格式为string类型的值。处理后变成and pass=test 如果我们输入%1$c,那么处理时。会将%1$c认为是字符串。然后变成and pass=%1$c 此时带入第二个spritnf中。格式化时就会变成select * from user where name=%s and pass=%1$c 根据格式化字符串的语法。%1表示第一个参数。也就是name对应的值。$c表示单个字符。会读取第一个参数的值并将其转换为字符类型 name输入39。pass输入%1$c 还有其他payload。如%1$'。转义后变成%1$\,将第一个参数替换为\类型。由于不存在这个类型。所以会替换空。剩下的单引号就逃逸了 最后结果如下 进入下一关。右键源代码中有hint。flag在/flag 由于部署环境。没有禁用mysql的load_file。大佬们直接就load_file盲注了。。。。。佩服佩服 预期解: 查看cookie。发现一个fiel参数。有一串16进制值。 解压得到flag.txt。猜测存在任意文件读取 修改cookie。读取/flag。提示not has flag 读取文件的内容中。不能包含flag。那么我们可以通过php伪协议base64加密回显结果。 提示not base64。 伪协议还有rot13.可以用。 最终payload: php://filter/read=string.rot13/resource=/flag 16进制后替换得到flag。然后rot13解密下
假赛生 这题其实考的是二次注入。可以注册和登陆。登陆后会将用户名带入查询。 需要成为admin。进入下一关 预期解: 二次注入。写入session内容为name|s:5:"admin";。然后替换session就能成为admin用户。 因为session实质上是将数据序列化后存入session_对应sessionID的。 比如/tmp/sess_2bevmvtacut18mlo3de90j6hha内容是name|s:5:"admin"; 那么sessid为2bevmvtacut18mlo3de90j6hha的用户就是admin。 payload: " union select unhex('6e616d657c733a353a2261646d696e223b') into outfile '/tmp/sess_2bevmvtacut18mlo3de90j6hha'# 然后替换sessionid登陆即可。 然而。在写入session时。是以mysql用户写入的。而session文件必须和中间件(apache)是同一用户。当时部署环境时。修改所属用户的脚本没写好。所以没部署成功就上线了。 非预期1: 群主直接在数据库中。插入了admin用户的数据。导致二次注入可以拿到admin密码。从而登陆 非预期2: 由于源码中只将输入小写。判断admin。并没有去除空格。而插入数据库时。mysql会自动忽略空格。所以注册admin空格。可以绕过检测。并成功插入数据库。从而登陆 对于下一关。一个正则。。 只要输入不是字母数字就OK。 那就随便输了。比如%///。甚至传一个空参就可以拿flag 此题是出题史上。非预期中的非预期 各位大佬别打脸。手下留情
guoke " union select unhex(‘6e616d657c733a353a2261646d696e223b’) into outfile ‘/tmp/sess_2bevmvtacut18mlo3de90j6hha
大佬大佬,如果我能想到这一步的话,我一定会想着写个shell进去啊~~~