文章目錄

只只做出来第一题~,说一下第一题。访问给出的url,返回doggy!php!。由于经验不足一开始不知道这是什么意思。根据题目的内容说登录验证有问题,就猜测登录的入口。login.php admin.php都不对。然后尝试Doggy.php也是不存在,根据返回信息说是ubuntu服务器,所以区分大小写。访问doggy.php返回登陆界面。这时候才想到doggy!php!的提示是指doggy.php。毕竟是web的题目,第一步得有web的url或者接口才能继续。

登陆接口查看源码:

<!DOCTYPE html>
<style>
 * {margin:0; padding:0;}
 body {background-color:#ddd;}
 #mdiv {width:200px; text-align:center; margin:50px auto;}
 input[type=text],input[type=[password] {width:100px;}
 td {text-align:center;}
</style>
<body>
AN EASY ONE FROM DOGGY...
<form method="post" action="./doggy.php">
<div id="mdiv">
<table>
<tr><td>ID</td><td><input type="text" name="id" /></td></tr>
<tr><td>PW</td><td><input type="password" name="ps" /></td></tr>
<tr><td colspan="2"><input type="submit" value="login" /></td></tr>
</table>
 <!-- <div>ni kan bu jian wo<a href='?view-source'>get source</a></div> -->
</form>
</div>
</body>
<!--
you have blocked accounts.
adog / gougou
-->

有两个有价值的注释

<!-- <div>ni kan bu jian wo<a href='?view-source'>get source</a></div> -->
    you have blocked accounts.
adog / gougou

一个a标签,指向?view-source的路径。访问返回了当前文件的源码。

<?php

if (isset($_GET['view-source'])) {
    show_source(__FILE__);
    exit();
}



 if(isset($_POST['id']) && isset($_POST['ps'])){
  include("flag.php");

  mysql_connect("localhost","adog","adog123");
  mysql_select_db ("adog");
  mysql_query("set names utf8");

  $key = flag();

  $id = mysql_real_escape_string(trim($_POST['id']));
  $ps = mysql_real_escape_string(trim($_POST['ps']));

  $row=mysql_fetch_array(mysql_query("select * from users where id='$id' and ps=md5('$ps')"));

  if(isset($row['id'])){
   if($id=='adog'){
    echo "your account is blocked";
   }else{
    echo "login ok"."<br />";
    echo "Password : ".$key;
   }
  }else{
   echo "wrong..";
  }
 }
?>

查看源码,发现进行了转义,所以第一猜想的注入就不存在了。根据给出的已经blocked的帐号,猜测要点应该是绕过if($id==’adog’)的判断,进入login ok的逻辑。注意这里判断采用的是$id而不是数据库取出的$row[‘id’]。进行一个简单的测试.

1

发现当字符串后面有空格的时候,mysql查询的时候是忽略这些空格的。所以这种情况下,$id和$row[‘id’]就不想等了。一个是’admin\s\s\s\s\s\s’一个是’admin’。但是$id在获取的时候进行了trim处理。$id = mysql_real_escape_string(trim($_POST[‘id’]))。所以空格肯定不可以用了。这个方向也比较明确,可以尝试fuzz看看是否有其他的字符会想空格一样被mysql忽略同时不会被trim函数过滤掉。

trim(PHP 4, PHP 5)

trim — 去除字符串首尾处的空白字符(或者其他字符)

说明¶string trim ( string $str [, string $charlist = " \t\n\r\0\x0B" ] )
此函数返回字符串 str 去除首尾空白字符后的结果。如果不指定第二个参数,trim() 将去除这些字符: 

" " (ASCII 32 (0x20)),普通空格符。 
"\t" (ASCII 9 (0x09)),制表符。 
"\n" (ASCII 10 (0x0A)),换行符。 
"\r" (ASCII 13 (0x0D)),回车符。 
"\0" (ASCII 0 (0x00)),空字节符。 
"\x0B" (ASCII 11 (0x0B)),垂直制表符。 

直接fuzz的结果如下,有6个字符会被trim过滤掉。跟php文档的说明一直。从0xc2-0xef的字符的字符会被过滤掉。php中指定了mysql使用的字符集是uft-8,mysql_query(“set names utf8”)。utf-8是兼容us-ASCII的字符集。从0x80-0xFF在utf-8中都没有指定对应的字符,所以这个段内的字符都是非法字符。XCTF两道web题目的writeup这里fuzz显示了的字符应该是浏览器设置了8859系列字符集的原因。

1
1
1

文章目錄