第三题
打开题目给的网址是让我们下载一个php文件打开是一串php源代码:
重要代码行注释:
最上面的注释是给了测试的环境,也就是你需要去内个网址里面找flag;
第八行的if()函数限制了我们传入的这个数组的最大元素数是三;
接下来的for循环和里面的if()函数的意思是遍历args[]这个数组的所有元素,而且每个元素要满足正则表达式的匹配,这里的pre_match() (可以先去菜鸟学习一下这个函数)函数返回值是0或1,也就是说你的数组元素每个都要要匹配这个正则表达式才不会执行exit();
'/^\w+$/':\w是[a-z],[0-9]和下划线"_"。^和$官方给出的解释:^:匹配输入字符串的开始位置(也就是说字符串的开头必须和它匹配例如:/^A/会匹配"And"中的A),$:匹配输入字符串的结束位置(同理)。+的意思是+前面的字符出现一次或多次。所以这里的意思就是你的数组元素必须满足开头和结尾和中间是[a-z],[0-9]和下划线"_"其中的。比如a,aa,1_4。
第十七行:implode()函数将给定的数组的元素拼接成字符串,第一个参数可选规定元素之间用什么分隔。总的意思就是创建了一个名为cmd的字符串变量,它的值是"/bin/2233 +(implode拼接后的字符串)"。
exec()函数执行外部程序,并将结果填充在out[]数组中。
下面的for循环就是将out[]数组的元素一 一打印出来。
思路:
https://security.bilibili.com/sec1024/q/pro/eval.php
打开是一片空白不过无所谓我们已经知道源码了,根据源码思路是通过URL通过GET方法传入一个名为args的数组参数,然后想办法让源码里的exec函数执行我们的恶意命令,
首先传数组形式的参数的方法是:?args[]=x&args[]=y&.......
然后很重要的一点在cmd变量中的/bin/2233是不能被作为命令来执行的,可以用换行来执行下一条命令,正好正则表达式里的$有个bug就是它在匹配的时候会忽略结尾的%0a(换行符),所以思路有了就是数组的第一个元素的值可以在范围里随意输入但是结尾要加上%0a,然后第二个元素就是我们要执行的命令了。因为换行符/bin/2233 和我们的第一个元素不会被执行,换行转而执行我们的第二三个元素的命令。
构造payload:①?args[]=a%0a&args[]=ls②?args[]=a%0a&args[]=cat&args[]=passwd
拿到flag。
这一题卡在了1:get传数组参数不会;2:cmd变量里的/bin/2233 不能作为命令执行没反应过来,这也导致没理解前面的正则匹配,原来是$会忽略结尾的%0a,正好这又是个换行,让第一个参数带着%0a将cmd之前的换行然后执行下面的第二三个参数里的命令。ls和cat (文件名)。
第四题
点开提示是sql注入的百度百科,那毫无疑问这题是一道sql注入题。
打开给的网址有首页、用户信息和日志信息。
既然是sql注入,然后用户信息和日志信息这里有输入框和搜索按钮,所以大概率在这里注入。但还不确定具体在哪里注入,通过抓包发现一件事情那就是日志信息里的搜索框没有username这一项但在数据包里出现了并且是空值,其他的输入框都正常,这不得不让我怀疑一下。
username就只有三个:2233、test和admin都试一下,发现了输入test和admin右边的code都是406,而输入2233时会返回200并显示数据。
然后又试了其他数字和其他字母和符号,发现只有是数字时才会返回二百,所以这里应该是数字型注入。自己只会MySQL数据库的注入希望这里是MySQL。
先尝试一下:2233 order by 4
然后一直不出数据,开始猜测是order by被过滤,最后发现是过滤了空格,那这里用/**/绕过
2233/**/order/**/by/**/4
一直试到6的时候返回406,说明有5列数据,那接下来可以用联合查询注入了。
所以页面会显示第三列的数据,那接下里构造payload
爆库:-1/**/union/**/select/**/1,2,database(),4,5
数据库名:q
爆表名:-1/**/union/**/select/**/1,2,group_concat(table_name),4,5/**/from/**/information_schema.tables/**/where/**/table_schema='q'但是这里没有返回数据,
猜测又是过滤了某些东西比如information、schema、单引号、where,这里先把'q'换成database()试一下是不是单引号。
果然只是过滤了单引号。然后就去flag表里找字段名。
-1/**/union/**/select/**/1,2,group_concat(column_name),4,5/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167
这里单引号被过滤,那这里直接用flag的十六进制。上面的q
那里也可以换成十六进制出数据。
这个叫flag的表里只有一个叫id的列。
爆flag:-1/**/union/**/select/**/1,2,id,4,5/**/from/**/flag
最后,拿到flag。
这一题不能说卡在哪里了,自己最基本的MySQL注入手工都掌握了,但是给出这样一个环境还是有点不知所措,三个输入框不知道在哪里注入,然后就瞎输入,什么数字字母单引号双引号都试了一遍什么用都没有,最后还是看的网上的wp知道抓包日志信息那里多出来个user_name。然后就是在bp里完成注入,这个注入本身其实不难,是最基础的数字型注入,过滤的东西也不多。