Web 89
知识点:
1. isset() 函数可以检测「变量是否存在」并非NULL。常用来判断变量是否被定义,以避免变量未定义而报错。变量「存在」返回 true ,变量「不存在」返回 false
2.intval() 函数可以获取变量的「整数值」。常用于强制类型转换。
语法:
int intval( $var, $base )
当 base 为空时,默认值是 0,会根据 $var 的格式来调整转换的进制。
- 如果 $var 以 0 开头,就使用 8进制
- 如果 $var 以0x开头,就使用 16进制
- 否则,就使用 10进制
intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。
- 「空数组」返回 0
- 「非空数组」返回 1
利用数组绕过
其他人的解题思路
Web 90
这个比较用的是强比较,会先判断两种字符串的类型是否相等,再比较值是否相等,后面的函数可参考上一题的用法,只不过这一题里面的base为0,可以用八进制或者十六进制绕过
还可以用下面的方法,因为4476a会被识别为4476
Web 91
知识点 :
-
^php$
是一个正则表达式,其中:-
^
表示字符串的开始。 -
php
是要匹配的字符序列。 -
$
表示字符串的结束。
-
-
im
是修饰符,其中:-
i
表示不区分大小写。 -
m
表示多行模式,这样^
和$
将分别匹配每一行的开始和结束。
-
构造payload:
?cmd=1%0aphp
Apache HTTPD换行解析漏洞(CVE-2017-15715)
Web 92
和Web 90差不多,但是这个题是弱比较,大差不差,利用进制绕过
Web 93
比前面多了个正则匹配,过滤了字母,用八进制,构造payload:
?num=010574
Web 94
知识点:
strpos函数是查找某个字符在字符串中的位置;这里需要明确这个函数的作用;
这个函数得到的是位置;如果存在,返回数字;否则返回的是false;
传送门
这道题目如果我们可以用八进制的4476来绕过,那么会有一个问题,因为八进制需要开头指定为0,而strpos()会匹配到数字0返回0,!0也就是1从而执行死亡函数,所以我们可以在八进制前面加一个空格,这样strpos()会返回1,所以我们把4476转换为8进制10574后,前面再加一个空格即可。构造payload:
?num= 010574
Web 95
过滤了字母和小数点,利用上一题的payload可以得到flag,过滤小数点是过滤了用小数点绕过弱比较的可能性,可以了解一下强弱比较的一般绕过手段
Web 96
只检测传入的u是不是flag.php,用大写试一下
出来了路径,可以加路径绕过
Web 97
简单理解一下这段代码,就是传入的a和b不能相同但是a和b在md5加密后的数值得相同,可以了解一下md5绕过,这里我们尝试用数组绕过
Web 98
知识点:? :在代码里有一种用法即
表达式1 ? 表达式2 : 表达式3
其意思是:如果表达式1为真,则运算表达式2,整个条件表达式的值为 表达式2的值;反之,则运算表达式3,整个条件表达式的值为表达式3的值。
第一句代码就是说get一个参数后会转化为post方式,最后一句代码又要求我们get传入HTTP_FLAG参数并赋值为flag,所以最终只需要post为HTTP_FLAG=flag即可,get也得传值,否则第一句代码无法执行
Web 99
知识点:
- array():创建一个数组
- array_push():将一个或多个元素插入数组末尾(入栈)
- in_array():检查数组中是否存在指定元素,第三个参数strict不指定默认为宽松比较
- file_put_contents():将数据写入文件中,相当于fopen()+fwrite()+fclose()
- rand():返回随机整数
因为不知道随机生成的数字,所以从1开始试一下,in_array第三个参数没设置为true,所以该函数是宽松比较(==),字符串型会先转化为整型再比较,只要值相同就可以了
访问1.php成功,即写入了1.php文件,内容为post传入的一句话,用蚁剑连接
Web 100
知识点:
is_numeric() 函数用于检测变量是否为数字或数字字符串。
PHP 版本要求:PHP 4, PHP 5, PHP 7
逻辑运算符的优先级:"&&" > "||" > "=" > "and",等号的优先级高于and,所以v0只跟v1有关系
var_dump()函数可以输出多个值
我们不能直接输出字符串,应该输出$ctfshow的值,所以利用v2和v3的位置把给的这个括号注释掉
0x2d的ascii码是-
Web680
提示post一个code参数来运行,试一下最原始的phpinfo();
禁用了一大堆,看其他博客说对open_basedir进行了限制
PHP的open_basedir
是一个安全机制,用于限制在PHP脚本中可以打开的文件或目录的范围,从而防止访问非法或未授权的文件系统资源
scandir()函数返回指定目录中的文件和目录的数组。
var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并返回数据类型.此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
查看当前目录的文件
code=var_dump(scandir('.'));
发现一个名为secret_you_never_know的文件,直接访问
在别的博客里面看到还可以用
code=highlight_file('secret_you_never_know');
Web681
看了半天除了白帽子就是绿帽子,还有一个好像登陆框的,遇到这种就习惯性的先bp抓一下,发现会返回一串sql语句
sql语句这里也没学的咋好就看别人的解题步骤了,先用单引号闭合,发现没啥变化,然后用\,发现出现在了返回的语句中
看别人发的
理解了半天,应该就是\会把'给转义了,然后前面一部分都相当于一串字符一直连到后面的'123\'所以就相当于后面解释的'xxx'123\',那就只需要让后面的''里面的能执行应该就可以
还有一种做法又否定了我上面的理解,用dirsearch扫,发现是.svn泄漏,访问得到压缩包,解压后得到源码,代码审计后发现是将'过滤了,而\'是绕过'的一种方式
hat不为green的时候输出flag,在check.php中str_replace("'", "", ...): 将字符串中的所有单引号替换为空字符串
看了这个有点懂了,因为将'过滤了所以我们需要用\'来代替',而要让这个语句永远为真则可以构造||1,后面的#也是为了注释掉最后面的\',将前面的语句闭合起来,这样就形成了'xxxx'||1,永为真