21st-day

 · 2019-8-20 · 次阅读


50.Once More([http:// http://ctf5.shiyanbar.com/web/more.php](http:// http://ctf5.shiyanbar.com/web/more.php “Once More”))
  未进入也面前有提示:又是php审计。已经想吐了。
hint:ereg()函数有漏洞哩;从小老师就说要用科学的方法来算数。
先进入页面看看,有如下代码:
if (isset ($_GET[‘password’])) {
if (ereg (“^[a-zA-Z0-9]+$”, $_GET[‘password’]) === FALSE)
{
echo ‘

You password must be alphanumeric

‘;
}
else if (strlen($_GET[‘password’]) < 8 && $_GET[‘password’] > 9999999)
{
if (strpos ($_GET[‘password’], ‘*-*‘) !== FALSE)
{
die(‘Flag: ‘ . $flag);
}
else
{
echo(‘

*-* have not been found

‘);
}
}
else
{
echo ‘

Invalid password

‘;
}
}
很明显必须输入满足条件的password即可获得flag.需要满足以下条件:
首先password必须要是大小写字母或者是数字,其次密码的长度需要小于8并且它的值要大于9999999.strpos是查找*-*在password中出现的位置如果有就返回true也就是说password中必须包含-这个符号就会给flag.先挨着试试,看它的逻辑,先试试小于9999999的就输入一个8888,输出invalid password对的。现在构造科学记数法1e8,没有找到*-*这就对了。现在要想一下这个*-*怎么放进去。当我直接把放后面的时候直接被ereg判断了下来,它不是字母和数字,那么根据提示我们知道这里要通过ereg的漏洞绕过它,ereg应该也是一个存在00截断的函数.因而构造?password=1e8%00*-*,直接获得flag.接下来采用另一种方法,ereg应该还有一个漏洞,它应该无法处理数组,因而直接构造payload:?password[]=111直接获得flag.
  summary:这里是如何绕过这两个判断的呢,由于ereg()与strpos函数都只能处理字符串的,遇到数组参数直接返回null而判断用的是===要求两边类型也相同,null与false不同类型因而绕过第一个判断,第二个是同样的道理,由于strpos遇到数组不能处理返回null这里直接返回null,判断采用!==因而正确通过得到flag.
51.Guess Next Session(http://ctf5.shiyanbar.com/web/Session.php)
  进入也面前的提示先记录下来:写个算法没准就算出来了,23333.hint:你确定你有认真看判断条件?
进入页面后发现三个奇怪的数字:15153725,2107025,14172013
先查看以下源代码:
session_start();
if (isset ($_GET[‘password’])) {
if ($_GET[‘password’] == $_SESSION[‘password’])
die (‘Flag: ‘.$flag);
else
print ‘

Wrong guess.

‘;
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
如果以get方式设置了password并且password的值等于session【password】的值就给出flag.下面还有一个算数,其中microtime()是返回当前Unix时间戳的微秒数,而mt_srand是给随机数播种,也就是自动生成随机数。那么这上面显示的三个数字是什么意思,在我刷新页面时这三个数字也自动刷新也就是随机数。在阅览其他WP后我get到了一个新知识点:Cookie与 Session,一般都会认为这是两个独立完全不同的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。因而通过BP先抓包,这里发现了Cookie参数中存在PHPSESSID输出它并且给password传个空值,就这样绕过条件使得password和session的值都为Null判断成立获得flag.
  summary:这道题的大致过程可看作如下:
1、当我们发送请求的时候,服务器以session_start()来开启会话,产生cookie相应头信息(默认为PHPSESSID),记录到新的session文件中,这里我们给的参数值是空,获取的$SESSION[‘password’]的值也为空。
2、然后再看脚本执行,使用$_SESSION[‘password‘]读取session文件的password的空值。
3、最后,将get的password的空值与$SESSION[‘password’]读取的空值比较,相等,得到flag。
这道题主要利用了session取值的原理,它与cookie虽然关系不大,但它却靠cookie传递它的值,也就是phpsessid,这道题把它的sessid删为Null在get一个password=就这样条件成立,解出该题。
52.天网管理系统(http://ctf5.shiyanbar.com/10/web1/index.php)
  进入页面后直接提示账户:admin 密码:admin但是点登入系统没有任何反应,查看以下源代码先:发现这样的提示:$test=$_GET[‘username’]; $test=md5($test); if($test==’0’)这儿的提示不太完整如果test=0就没说了。用我得md5值为0e的那些来试试,在输入s878926199a后给出了/user.php?fame=hjkleffifer。打开这个网页发现:
$unserialize_str = $_POST[‘password’];
$data_unserialize = unserialize($unserialize_str);
if($data_unserialize[‘user’] == ‘???’ && $data_unserialize[‘pass’]==’???’) {
print_r($flag);
}
伟大的科学家php方言道:成也布尔,败也布尔。 回去吧骚年.
也就是说如果user与pass反序列化后都为???就给flag.
我先去试试序列化???是多少得到:s:3:”???”;再去POST试试,不对得重新阅读代码。
这里在构造序列化时需要足以这个$data_unserialize应当是一个数组,它里面有user与pass这两个键要想条件成立必须都时他们的值为true,因而在php测试代码中构造数组:$test1=array(“user”=>true,”pass”=>true);这样就满足了所有的的条件,再输出echo serialize($test1);得到的序列化值传给天王登陆框的密码便能登陆系统得到flag了。
  summary:这道题主要要弄懂代码要求的判断含义并且要充分掌握序列化的用法,
array(2) { [“user”]=> bool(true) [“pass”]=> bool(true) } string(36)
“a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}”
以上两个分别是数组形式的输出与序列化的输出,这里说明以下序列化的构造首先字母与数字之间用:隔开其次键的值会直接保留,然后boot(true)的话true序列化是1.bool直接用b表示连起来就是b:1不用的解释之间用;隔开例如[“user”]直接序列化为”user”然后到了bool(true)他们俩个就用”user”;b:1就这样表示了。因而前面部分就是a:2:{s:4:”user”;b:2;
这里的s:4是说明user是string类型然后长度是4.后面类似表示方法就不说了,主要要看懂这道题的序列化序列的是数组形式然后要通过判断的话需要他的Bool值为true,就这样再按意思传递给password值就得到了flag.