链接:http://www.hetianlab.com/expc.do?ce=da6240f9-e4bd-4020-94d8-55ee7afc988c
因为是web类型的题目,所以我们先在浏览器中打开这个链接。
打开后,发现这是一个后台登陆界面。由于提示是检查源码,所以直接查看登陆界面的源代码。
代码注释这里发现了一个叫做source.txt的文件。我们打开这个文件看看。
1 <?php 2 $flag = "XXXXXXXXXXXX"; 3 $secret = "xx"; 4 5 if(!isset($_ POST["username"]) || !isset($_ POST[" password"]){ 6 exit(); 7 } 8 $username = $_ POST["username"]; 9 $password = $_ POST["password"]; 10 if (!empty($_ COOKIE["check"])) { 11 if (urldecode($username) === "admin" && urldecode($password) != "admin") { 12 if ($_ COOKIE["check"] === base64_ encode($secret) . urldecode($username . $password))){ 13 echo "Login successful. " ; 14 die ("The flag is ". $flag); . 15 else { 16 die ( "重新检查下你的cookie吧!"); 17 } 18 else { 19 die ("你是不是管理员心里没点数吗?"); 20 } 21 } 22 setcookie("ahash", base64_ encode($secret . urldecode(" admin" . " admin")), time() + (60 * 60 * 24 * 7)); 23 ?>
解读一下这个代码(百度上面代码中出现的php函数,去理解这个代码意思)。
- isset():作用是检查变量是否设置,并且不为null,加个!,表示取反的意思。链接:https://www.php.net/manual/zh/function.isset.php
- empty():作用是检查变量是否为空。 链接:https://www.php.net/manual/zh/function.empty.php
- $_COOKIE:作用是设置或获取cookie值。链接:https://www.php.net/manual/zh/reserved.variables.cookies.php
- $_POST:作用是用于收集来自method =“ post”的表单中的值。 链接:https://www.php.net/manual/zh/reserved.variables.post.php
- urldecode():对字符串进行url解码。 链接:https://www.php.net/manual/zh/function.urldecode.php
- base64_encode():对字符串进行base64编码。 链接:https://www.php.net/manual/zh/function.base64-encode.php
- setcookie():作用是发送cookie。 链接:https://www.php.net/manual/zh/function.setcookie.php
- . 是php中的字符串拼接符号。
从上面代码中,我们知道,想要得到flag。必须满足3个条件。
- check这个cookie的值不能为空。
- username解码后的值必须是admin,并且password解码后的值不能为admin。
- check这个cookie的值必须等于secret经过base64编码后,拼接字符串adminadmin解码的值。
这个时候,我们打开bp,抓包。(账号尽量输入admin,密码输入admin以外的字符串就行,后期改包快)
从抓包的结果中,我们可以看见发送的cookie ahash的值为0DhhZG1pbmFkbWlu。
并且没有cookie check的值。因此我们还需要去修改数据包。并且从源码中,我们知道admin和1经过url编码后的值就是username和password的值。
使用bp自带的解码功能后。我们知道,secret的值为88(在终端下,运行ehco 0DhhZG1pbmFkbWlu | base64 -d 也可解码)。
将admin进行url编码。
补充:url编码的格式是16进制,十六进制格式用于在浏览器和插件中显示非标准的字母和字符。
所以admin要用hex编码,用url直接编码,可能会没有结果。
编码结果是%61%64%6d%69%6e
1经过编码后
编码结果是%31
再将88经base64编码
然后我们开始构造check,username,password。然后go
终于拿到flag。url编码和hex编码那里的,我卡住了,最后看了大佬解答,以及百度百科对url编码的解释,才走到了flag这一步。
上课的时候摸鱼,做题的时候,一脸懵逼。