Code-Audit-Challenges(二)

继续来研究常见的php代码漏洞!

11.

这里我们传入一个PWD值,经过一次MD5加密之后会将里面的HEX值做一次转化

exp:?pwd=ffifdyop

这里首先将传进来的PWD值进行一次MD5计算,md5值为276f722736c95d99e921722cf9ed621c,这里再做一次HEX转化之后就会变成’or’6<trash>,拼接进去就变成了

SELECT * FROM admin WHERE pass=”or’6<trash>’

这里的<trash>表示无用,直接忽略

12.

(就喜欢这么简单直接的php代码。。)

变量覆盖?

exp:?hello=);eval(phpinfo());//

13.

代码很长,也有很多变量需要比较,一一来看一下~

首先是$a[“bar1”]要大于2016,这里利用php弱类型,令$a[“bar1”]=2017a,这样命名有两个原因,第一个是is_numeric()会判断$a是否是数字,若为数字直接就die了,因此这里不能直接赋值为数字,第二个原因是在比较时,会直接转换成2017,后面的a会直接省略~

然后是$a[“bar2”],首先判断$a[“bar2”]是否是一个数组,长度是否为5,数组中第一个元素是否又为数组,这里令$a[“bar2”]=[[],2,3,4,5]

接着是判断$a[“a2”]是否存在“nudt”字符串,不存在返回false(这里a2是进行数组查找,所以a2为一个数组)

最后代码令$v2=1

再返回代码起始处,$a是由$foo进行json decode得到的,因此这里

$f00={“bar1″:”2017a”,”bar2″:[[],2,3,4,5],”a2″:[“nudt”]}

下面来看猫猫狗狗($cat、$dog)的故事

同样首先$cat为一个数组,然后进行strcmp比较,这里都好满足,继续往下看。。

将$d和$c[0]进行拼接,然后通过eregi()来做正则匹配,若出现“3”、“1”、“c”则匹配成功直接die,最后进行两个拼接后字符串的查找

总结上述,设置$dog=%00,$cat[0]=”ahtctf2016″,$cat[1][]=

进行上面的代入来看看具体原理

首先是if(!strcmp($c[1],$d) && $c[1]!==$d),strcmp()函数在遇到数组比较时就会产生安全问题,这里也一样,虽然c[1]!==$d,但是strcmp(c[1][],$d)就会变成0,这其实是strcmp()函数的一个漏洞,CTF中也会经常出现~

其次是eregi(“3|1|c”,$d.$c[0])?die(“nope”):NULL;这里是典型的eregi截断漏洞,这个函数遇到%00直接退出

最后是strpos(($c[0].$d), “htctf2016″)?$v3=1:NULL;这里就是一个字符串查找工作,但是不能在首位找到,因此构造$cat[0]=”ahtctf2016”

14.

好多题目都见过啊。。不过解法有点忘了。。

这里过滤了很多,包括逗号!

这里使用的考点是group by with rollup

with rollup的作用是用于最后统计,但是对应的值为NULL

因此这里我们需要进行数据位偏移,使得我们查询的值为这个rollup up产生的NULL,然后我们再令PWD为空,注入成功

exp:uname=’ or 1=1 group by pwd with rollup limit 1 offset 2 #&pwd=

这里因为过滤了逗号,因此不能直接limit1,1等,offset用法其实是一样的~

15.

代码不是很长,但是我一眼就看到了sha1加密,然后进行比较,还是严格比较,当我们传入的是数组的时候,这时候sha1(array)===sha1(array),即为sha1(null)===sha1(null),因此会判断成功

exp:?name[]=1&password[]=2

16.

找了一圈,没看到过滤函数,大胆的注入吧~

$user没有任何过滤语句,可以直接注入!

令$user=’ union select “0e830400451993494058024219903391″#

这里拼接进去就变成了select pw from php where user=’ ‘ union select “0e830400451993494058024219903391″#

这里的0e开头纯属巧合,并不是利用php弱类型比较!

exp:$user=’ union select “0e830400451993494058024219903391″#&pwd=QNKCDZO

这串md5值正为后面QNKCDZO的md5值,这里不是弱类型比较!因为前面的$user为空,因此$query也就会选择后面这串MD5值,由于是我们构造的,因此能够匹配成功!

17.

首先要有POST的方式,不然不给,其次就是POST中变量一定为flag,不然会die,接下来是两个遍历,利用遍历,发现能够直接把$flag覆盖

exp:?_200=flag

POST:flag=1

这里最主要的是那个GET语句,这里我们将_200的值赋值为flag,因为最后有个die($_200),所以最后会输出flag

18.

这里这么多msql操作,肯定是要求我们构造一个注入语句,但是上来就给我一个gpc和一个htmlentities,莫非是利用转义来进行逗号逃逸?

exp:username=admin&password= or 1#

最后拼接语句:query=’SELECT * FROM users WHERE name=’admin’ AND pass=’ or 1#’;’;

19.

三个白帽的题目好像。。

对于这种二次注入不是很精通,看了好久的wp也没懂。。

这里先给出exp,再来好好研究下原理

exp:?message=aaax27 and updatexml(0,concat(0x27,(/*!00000select version()*/)),0)%23

报错注入,没什么好说的,有很多种报错方式,自我觉得updatexml是最简单的,就先来看updatexml()这个函数吧,首先updatexml用法是updatexml(0,mysql语句,1)

但是这里使用的是mysql数据库,其中有个特性就是内联注释/*!mysql语句*/,这里就用到了这个知识点,但是前面有五个0表示mysql版本,如果现在的mysql版本为5.7.9,那么/*!50709user()*/将会返回mysql的user,这里并没有报错,因为mysql的版本没有问题,但是如果是/*!00000user()*/,这里就会出错,从而产生报错注入!

这样构造是因为可以回显报错语句,更重要的是可以绕过那个正则匹配

最后我们再来看这个addslashes怎么办,这中间出现了一个没见的函数stripcslashes(),百度了一下,这函数竟然会删除由addcslashes() 函数添加的反斜杠。。。这也是够坑的。。

20.

很明显的update注入~

但是这种注入手法不常见,而且注入语句不在同一行,因此不能用注释符直接注释,最后有个addslashes()函数作为拦路虎,,所以这条题目难度就上来了。

感觉自己水平尚浅,对于这个问题并不能说清,就放出wp地址:传送门

相关推荐: 火种CTF-writeup

暑期有空参加了火种CTF的比赛,比赛总的来说不是很难,但是web部分遇到了很多困难,不过cryto较为简单,全部做出来了。逆向是一如既往的放弃,我要开始好好学逆向了~ 附比赛的wp: 传送门:火种CTF-wp 相关推荐: 利用java复现 ES文件浏览器 CV…

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论