Guess Next Session
看题目提示,是一道代码审计:
1 <?php 2 session_start(); 3 if (isset ($_GET['password'])) { 4 if ($_GET['password'] == $_SESSION['password']) 5 die ('Flag: '.$flag); 6 else 7 print '<p>Wrong guess.</p>'; 8 } 9 10 mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000)); 11 ?>
其中的判断条件就是$_GET['password'] == $_SESSION['password'],传入的password要等于session中的password,在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,sessionID可在cookie中找到,当我们删除cookie中的sessionID后,$_SESSION['password']就会返回空,我们同样传入空的password就能绕过了
先拿burp抓包,果然是存在PHPSESSID,删除后面的值,password不要赋值,go一下就能拿到flag
Once More
又是代码审计╮(๑•́ ₃•̀๑)╭
1 <?php 2 if (isset ($_GET['password'])) { 3 if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) 4 { 5 echo '<p>You password must be alphanumeric</p>'; 6 } 7 else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) 8 { 9 if (strpos ($_GET['password'], '*-*') !== FALSE) 10 { 11 die('Flag: ' . $flag); 12 } 13 else 14 { 15 echo('<p>*-* have not been found</p>'); 16 } 17 } 18 else 19 { 20 echo '<p>Invalid password</p>'; 21 } 22 } 23 ?>
代码的首先判断传入的password中是否只含有字母跟数字,接着要求password长度小于8且数值大于9999999,并且password中要含有*-*
这里有两种方法:
1.ereg()截断漏洞
因为ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。
构造payload:password=9e9%00*-*
注:其中#必须用%23代替
2.当ntf为数组时它的返回值不是FALSE
构造payload:password[]=111