前言
此笔记为在Bugku CTF平台上做代码审计题目的过程,也算是一篇wp吧
extract变量覆盖
extract($_GET):
$_GET:表示在传递参数时,URL通过get的方式传参,传输的数据以数组的形式封装在$_GET中
extract():从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量
file_get_contents():将整个文件读入一个字符串
trim()去除字符串两侧的空格或者指定字符trim(’string’,’string you want to delete’)
extract()函数的变量覆盖漏洞在于如果导入的数组中有与原来符号表中同名的变量,将会覆盖掉原有的变量,因此对于这道题,我们只需要构造payload?shiyan=&&flag=
此时我们就可以利用变量覆盖漏洞,使原有的flag漏洞的值被覆盖为空,再与我们传入的shiyan变量相比较,空等于空,因此得到flag
strcmp比较字符串
题目地址:
http://123.206.87.240:9009/6.php
由源码可以看出,题目通过GET方式传递参数a,然后将a和flag变量的值进行比较,若相等则输出flag的值。int strcmp(string str1,string str2)
如果str1小于str2返回0;如果两者相等返回0
这个函数存在一个漏洞就是当传入的参数不为字符串类型时,这个函数将发生错误,在php5.3之前,函数在显示错误信息后,将会返回0,因此我们可以传入payload?a[]=123
即可得到flag
urldecode二次编码绕过int eregi(string pattern,string string,[array regs])
eregi()函数在一个字符串搜索指定模式的字符串。搜索不区分大小写,如果匹配成功则返回TRUE,否则返回FALSEurldecode()
urldecode()函数的作用就是将url编码后的字符串还原成原来的样子
因此这段代码的意思就是通过GET方式传入id参数,id的值不可以是hackerDJ,但是id的值在url解码后要为hackerDJ才可以得到flag,所以考虑用url二次编码绕过,在转换软件中对hackerDJ进行二次url编码后得到payload?id=%25%36%38%25%36%31%25%36%33%25%36%42%25%36%35%25%37%32%25%34%34%25%34%41
即可得到flag
md5()函数
题目地址:http://123.206.87.240:9009/18.php
题目源码如下:
对