bugku 代码审计 write up

今天做了一波审计的题目,就记录一下吧

extract变量覆盖

查一下php手册

Cgy8iT.md.png
本函数用来将变量从数组中导入到当前的符号表中。
返回成功导入到符号表中的变量数目。
而且这个函数没还有任何参数,很危险,直接可以修改冲突的变量
CgyJWF.md.png

关键的代码
CgyUy9.png
构建的payload: ?shiyan=&flag=
因为不知道flag里面什么内容,让它变成空,然后使$content变成空,然后$shiyan变量和$content变量的内容都会被设置成空. 满足条件便会出现flag

strcmp比较字符串

这题关键的函数都没给出来。。。题目说用strcmp的特性。。。
那我就随便个数组进去一个?a[]…flag就出来了。。尴尬

urldecode二次编码绕过

这个题好像在实验吧做过。。。。。
利用了两次urldecode第一次是浏览器的解码第二次是函数的解码
所以我利用了里面的其中一个字母D编码第一次编码是%44,第二次编码是%2544
payload: ?id=hacker%2544J

md5()函数

利用php的md5()函数有一个缺陷,这里是===,只能用数组处理,它无法处理数组返回null构造payload: ?username[]=1&password[]=2

数组返回NULL绕过

首先是ereg这个正则匹配函数是处理字符串的。。。构造数组是返回null,然后的话null===false 不相等可以执行下面的else if语句。。。
strpos处理数组页数返回null,于是null!==false成立就得到了flag
payload: ?password[]=1

sha()函数比较绕过

关键部分还是===,只能用数组处理,利用了sha1函数处理数组返回null的特性。
payload: ?name[]=1&password[]=2

md5加密相等绕过

这一题里面是==,直接找一个MD5之后还是0e开头的即可,比如s878926199a
payload:

十六进制与数字比较

ord() 函数返回字符串的‘首个’字符的 ASCII 值。
利用这一个与题目的16进制,用16进制开头的0x去绕过即可。。。
用Python写个脚本转换一下

1
2
num = 3735929054
print ('%##x'%num)

得到0xdeadc0de
payload: ?password=0xdeadc0de

ereg正则%00截断

因为ereg存在%00漏洞,所以在第一个条件里面先构建一个截断绕过,然后就开始执行下面的else if语句,长度要小于8,数目要大于9999999,这里就用科学计数法,用1e8去绕过
下面还有一个strpos函数还要判断里面是否含有’-‘符号,所以最后的payload应该是:?password=1e8%00–,出错了。。。
CgyaLR.png
没办法只能找一下原题,发现人家的题目是要包含*-* ,但是他题目就一条横杠。。。坑了不少人。。。
改一下payload: ?password=1e8%00*-* ,立刻出flag
查了查手册,还有个类似的函数叫eregi,只是不判断大小写罢了
CgyBo6.md.png

strpos数组绕过

这一题跟那题数组返回NULL绕过,感觉好像是一样的。。。。。
就是传入的参数不一样了。。。。。
payload: ?ctf[]=1

后来看了看下面的文章,发现还有一个方法2:字符串截断,利用ereg()的%00截断漏洞,绕过正则过滤 ?nctf=1%00##biubiubiu 发现是一堆乱码,
CgyrFK.png这里需要特别注意, 需将##编码 ?nctf=1%00%23biubiubiu 才能出flag。。。。

给一个适合新手的学习文章:

http://www.freebuf.com/articles/rookie/152209.html


听说,打赏我的人最后都成了大佬。



文章目录
  1. 1. extract变量覆盖
  2. 2. strcmp比较字符串
  3. 3. urldecode二次编码绕过
  4. 4. md5()函数
  5. 5. 数组返回NULL绕过
  6. 6. sha()函数比较绕过
  7. 7. md5加密相等绕过
  8. 8. 十六进制与数字比较
  9. 9. ereg正则%00截断
  10. 10. strpos数组绕过
  11. 11. 给一个适合新手的学习文章: