欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

bugku 代码审计 write up

程序员文章站 2022-05-16 09:11:12
...

extract变量覆盖

查一下php手册
bugku 代码审计 write up
本函数用来将变量从数组中导入到当前的符号表中。
返回成功导入到符号表中的变量数目。
而且这个函数没还有任何参数,很危险,直接可以修改冲突的变量
bugku 代码审计 write up
关键的代码
bugku 代码审计 write up
构建的payload: ?shiyan=&flag=
因为不知道flag里面什么内容,让它变成空,然后使contentshiyan变量和$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写个脚本转换一下

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

得到0xdeadc0de
payload: ?password=0xdeadc0de

ereg正则%00截断

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

strpos数组绕过

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

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

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

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