①foreach+$$可变变量覆盖
引入:
1 2 3 4 5
| <?php $a = 123; $123 = 456; echo ${$a} ==> 456 ?>
|
example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| <?php error_reporting(0); show_source(__FILE__); include "flag.php"; $_403 = "Access Denied"; $_200 = "Welcome Admin"; if ($_SERVER["REQUEST_METHOD"] != "POST") die("CISPCTF is here :p..."); if ( !isset($_POST["flag"]) ) die($_403); foreach ($_GET as $key => $value){ $$key = $$value; print_r($$key); echo "------"; print_r($$value); } foreach ($_POST as $key => $value){ $$key = $value; } if ( $_POST["flag"] !== $flag ) die($_403); echo "This is your flag : ". $flag . "\n"; die($_200); ?>
|
②extract()函数导致的变量覆盖漏洞
- 引入:由于未系统学习php,看了一些参考后,对extract()函数的理解还不是很透 彻。。。 但大致可以利用extract($_GET/$_POST)函数来实现将GET或POST的变量名与其对应的值传入;漏洞就发生在若用户传入的变量名与已有变量相同,则用户传入的变量名与其值会将原有的值覆盖造成变量覆盖漏洞。
1 2 3 4 5 6 7 8 9 10 11
| $flag = 'xxx'; extract($_GET); if (isset($gift)) { $content = trim(file_get_contents($flag)); if ($gift == $content) { echo 'hctf{…}'; } else { echo 'Oh..'; } }
|
PAYLOAD:?gift=&flag=
1 2 3 4 5 6 7
| <?php if ($_SERVER["REQUEST_METHOD"] == “POST”) { ?> <?php extract($_POST); if ($pass == $thepassword_123) { echo $theflag; } ?>
|
PAYLOAD:POST==>pass=&thepassword_123=
③parse_str(string,array)函数导致的变量覆盖漏洞
- 引入:该函数用于解析给出的string字符串,并将其注册为变量,之后将变量存入array数组中,若未给出参数array则只注册变量(ex:parse_str(‘a=1&b=2’); echo $a; echo $b ),漏洞就发生在注册变量时不会检查变量是否已经存在,当变量名与已有变量名重复则会造成变量覆盖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?php error_reporting(0); if (empty($_GET['id'])) { show_source(__FILE__); die(); } else { include ('flag.php'); $a = "www.OPENCTF.com"; $id = $_GET['id']; @parse_str($id); if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) { echo $flag; exit; } else { exit('其实很简单其实并不难!'); } }
|
④import_requests_variables函数导致的变量覆盖漏洞
- 引入:此函数可以直接将GET/POST/Cookie的参数注册成变量,所以变量覆盖就显而易见了。
⑤小结:
变量覆盖漏洞其实都大同小异,无非就是通过GET或POST传入一些参数,经过上述几个函数的处理,将这些参数解析为了PHP中的变量,若已给出的参数名与已有的变量名相同,则会将变量的值直接覆盖。另外,在实战中,变量覆盖漏洞要考虑的不仅仅是变量覆盖,还要结合后续代码来真正利用起来这个漏洞
最后更新时间: