advance injection
基础注入篇一共有22关,经过基础篇的洗礼,这个关卡通关并不难;
但是要善于总结(总结在末尾),虽然我并不是一个善于总结的人,但是可以通过总结理清思路,总结自己学到的东西呀!!!
less-23
首先分析肯定是get的注入,在后加入?id=1看能否回显正常,果然提示登录成功
判断一下是什么字符型的注入(’ “ ( ) )
输入单引号直接报错,说明可能是单引号字符型但是闭合单引号依然报错,可能使用–+闭合行不通;
这里可能被过滤了,url后面加一下?id=1' or '1'='1
试一下是否会报错果然登录成功:
下面暴字段数,这里order by可能不太好用,用联合查询试出来字段数:
最后试出来有三个字段并且回显的字段是第二三字段;
接下来查看数据库以及数据库版本号:
因为数据库版本在5.0以上,有个特殊表的存在,然后紧接着暴表名、爆列名、暴值,过程不再多赘述前面有很多例子;
less-24
这里要用到的方法之前没有碰到过,二次注入;
这里我们首先使用常规方法在登录页面能不能注入成功,一是万能密码用不了,二是密码错误不会回显出有效信息
在这里肯定是没有注入点了,索性看一下源码做了什么防御:
function sqllogin(){
$username = mysql_real_escape_string($_POST["login_user"]);
$password = mysql_real_escape_string($_POST["login_password"]);
$sql = "SELECT * FROM users WHERE username='$username' and password='$password'";
//$sql = "SELECT COUNT(*) FROM users WHERE username='$username' and password='$password'";
$res = mysql_query($sql) or die('You tried to be real smart, Try harder!!!! :( ');
$row = mysql_fetch_row($res);
//print_r($row) ;
if ($row[1]) {
return $row[1];
} else {
return 0;
}
}
显而易见,这个函数中有mysql_real_escape_sring()这个函数进行了转义,这也是万能密码用不了的原因;
登录进去会是一个修改密码的界面,这里还有另外两个页面,一个是忘记密码页面,一个是注册新账号页面,通关查看源码对注册用户页面并没有进行过滤,那我们试着注册一个账号admin’#,然后再用账号去修改密码;
登录成功之后
我这里修改的密码是123456,然后登陆成功完成注入
less-25
下面蓝色字体提示我们输入的内容会被过滤显然单引号并没有过滤,输入?id=1' --+
,登录成功说明–+也没有过滤,这就好办了,因为已经找到了注入点,可以按之前的思路暴表暴值了,但是这里并不知道它过滤了什么呀,所以还是瞅瞅源码:
只截取了关键部分,定制黑名单的函数:
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/AND/i',"", $id); //Strip out AND (non case sensitive)
return $id;
}](https://img-blog.csdnimg.cn/20200323193042255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTcxNzU5,size_16,color_FFFFFF,t_70)
说明这里已经过滤了or/AND的,直接双写绕过就好辽:
AND也是一样的,这里就不展示了;
lees-25a
id=1的时候可以登录没有报错,但是id=1’的时候就没有回显的内容了,报错注入肯定是行不通的了,刚开始我思考了半天,后来发现
单引号并没有被过滤,我才发现自己做题做多了却忘记sql注入的一般步骤了,首先应该是判断注入类型(字符型或是数字型)的啊,字符型我都试了一遍,闭合也不能成功,这样大概就是数字型注入了
果然,注入成功(后面凡是爆出数据库了就算是成功了,因为后面的暴表暴字段暴值都是做过好多遍了的)
其实这一关和25关一样只是没有了那个单引号;
less-26
根据提示知道也是黑名单机制,其中space空格和comments注释应该是都被过滤了,看一下源码:
function blacklist($id)
{
$id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive)
$id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive)
$id= preg_replace('/[\/\*]/',"", $id); //strip out /*
$id= preg_replace('/[--]/',"", $id); //Strip out --
$id= preg_replace('/[#]/',"", $id); //Strip out #
$id= preg_replace('/[\s]/',"", $id); //Strip out spaces
$id= preg_replace('/[\/\\\\]/',"", $id); //Strip out slashes
return $id;
}
ps:其中\s代表空格/i表示大小写不敏感
虽然这里空格被过滤了,但是%A0可以代表空格(这里会被解码成带问号的黑框)也可以使用以下代替:
%09 TAB键(水平)
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
既然这里空格可以过滤,就不用在注释符上伤脑筋了,构造?id=1'%A0 oror '1'='1
发现这样可以登录成功(ps:这里如果oror也被过滤了,可以使用&&,但是要自己url编码成%26%26不然会报错)
解决了这几个问题后面的也就不用过多赘述了;
less-26a
像25a一样,这里也变成了盲注,但是我们刚刚并没有用报错注入的方法,所以这里影响并不大,依旧是用联合注入,要提醒一点的是这里多了一个圆括号构造payload的时候后面的’)要闭合掉毕竟这里不能使用注释,还有这里不能用双写or绕过要使用%26%26进行绕过,其余的与less-26大致相同使用联合查询,不再赘述;
less-27
根据提示是过滤了select和union关键字,单引号报错,闭合时发现还过滤了别的符号,比如空格我这里用%A0代替,以及大写OR代替小写,闭合成功说明是单引号字符型注入
/?id=1%27%a0OR%a0%271%27=%271
这里过滤了select和union,看能不能双写和大写绕过
?id=0%27%a0uniunionon%a0SESELECTLECT%a01,2,3%a0%27
运气还不错这下绕过了,依然可以用联合查询绕过
还有一种报错注入的方式可以利用,直接利用函数xmlupdate爆出数据库
less-27a
和less-27不同的只是需要闭合的符号是不一样的,这里是双引号;
但是我还是去看了以下源码,我运气还真是好刚好这样写恰巧绕过了,所以防御方面的话还是用白名单比较好
less-28
经过几番尝试之后判断类型是基于单引号括号的盲注类型
虽然这里过滤了union以及select,但是还是可以对他们进行绕过,不过这里我双写它解析不出来
?id=0%27)%a0unioN%a0SeLeCt%a01,database(),3%a0OR%a0(%271%27)=(%271
这样就可以暴出数据库:
less-28a
好像和less-28一样,唯一不一样的就是第二个回显位永远是1
less-29
看着有waf刚开始还有点怕,但是这个waf也太…不说什么了
但是作者把题目放在这里很不正常欸应该是希望我们用别的方式去攻击把,然后上网查了查,这里要利用tomcat与apache解析相同请求参数不同的特性,tomcat解析相同请求参数取第一个,而apache取第二个,如?id=1&id=2,tomcat取得1,apache取得2,而这里的防火墙就是tomcat了,构造payload:
?id=1&id=-1’ union select 1,version(),database() --+
同样暴表暴版本
less-30
抱歉各位我笑了,这也太扯了我原本真的很期待,但是随便整一下就没了,双引号盲注带着个"最好的"waf
less-31
同样和上面一样无脑,只是现在符号是双引号加上括号,一是利用联合查询注入二是参数污染;
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;
}
preg_last_error 函数用于转义正则表达式字符。正则表达式特殊字符有:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
很明显的是这里输入的单引号会被转义,比如输入 ’ 就会变成 ’
可以使用宽字节绕过:
构造payload:
?id=-1%E6' union select 1,version(),database() --+
当要转义字符’时,\会与%E6结合从而注掉\,之后的不多说
less-33
可能这题是想让我们学习下面这个函数吧
别的不多说,都一样;
less-34
是一个登录页面,用万能密码试一下
发现’被转义了,怎么去绕过转义,抓包抓包
over
less-35
简简单单暴库,显然有时候不能把问题想复杂
攻击和防御总结
指的是针对这些关卡的总结(65关完结之后我再写个大总结)
攻击:
1.不要局限于某一种方法,思路要广阔分析也得准确(比如闭合单引号可以用#或者–+或者or ‘1’='1等等)
2.二次注入:个人觉得比较重要的就是要对注入点判断正确(比如这里一共又三个页面,最先应该从哪里下手然后又是要从哪里下手)
3.碰到黑名单机制要熟练掌握各种绕过方法(大小写、双写、编码、可代替特殊符号)或是换一种注入方法或者函数巧妙避过黑名单
4.绕过方法(因为这里安全狗不是很给力所以…)这里利用到tomcat和apche解析参数的不同特性构造参数污染
5.宽字节注入(特殊字符被转义,使反斜杠无效)
防御:
1.这里很多是黑名单机制(过滤特殊字符特殊函数),白名单机制更莱斯;
2. 对用户输入进行转义(比如设计到的一些函数)
3.设置安全狗(但是像那种best waf还是算了叭)