lesson17

过滤

过滤函数

从此开始, 加入了过滤函数。 我们不但要构造可用payload,还要绕过过滤。

lesson17

  • input

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))

{
//making sure uname is not injectable
$uname=check_input($_POST['uname']);  

$passwd=$_POST['passwd'];

可以看到 $uname处嵌套了chek_input, 这就造成了字符限制。

  • sanitize

function check_input($value){
	if(!empty($value))
	{
			// truncation (see comments)
			$value = substr($value,0,15);
	}

	// Stripslashes if magic quotes enabled
	if (get_magic_quotes_gpc())
	{
			$value = stripslashes($value);
	}

  // Quote if not a number
	if (!ctype_digit($value))
	{
		  $value = "'" . mysql_real_escape_string($value) . "'";
	}
	else
	{
		  $value = intval($value);
	}
	return $value;
	}

这个过滤函数做了三件事:

  1. 截断,匹配0,1个字符

  2. 如果开启了get_magic_quotes_gpc() 则去掉反斜杠转义(http://www.nowamagic.net/librarys/veda/detail/1012arrow-up-right

  3. 如果是数字型则intval 其他mysql_real_escape_string

  • sink

这儿有两句sql,两次查询, 从业务功能上看,这是一个用户更新密码点,先查到用户信息,在通用户名去更新密码。

看第一句sql看上去不需要引号闭合。但是在过滤函数中如果不是数字就给加上单引号了, 这样就防护了数字型过滤。看上去比较难搞...

看看lesson17的介绍是 Update Query- Error based 也就是提示使用第二句。这里的$passwd是一个可控变量,而且在传入的时候并没有check_input 那么截断后边的usernan 我就控制了一个update语句。

这里首先你要在第一条语句能够查处内容来,才能通if的控制条件, username处填admin, 来到第二处,控制了一个单引号闭合的$passwd。

来看他的回显:

这里有错误的回显,因此我们可以在这里构造报错注入:

  • payload:

    • username: admin

    • new password: ' and (updatexml(1,concat(0x7e,(select user()),0x7e),1))#

Last updated