1.[ACTF2020 新生赛]BackupFile
(1)打开页面后根据提示是备份文件
(2)查看源码发现啥都没有
(3)这里啊直接用工具扫描,可以扫描到一个文件名为:/index.php.bak的文件
(4)然后访问这个连接,然后把备份文件下载下来然后访问这个连接
(5)发现是代码审计,记事本打开查看它的php文本
(6)在PHP中:
= = 为弱相等,即当整数和字符串类型相比较时。会先将字符串转化为整数然后再进行比较。比如a=123和b=123admin456进行= =比较时。则b只会截取前面的整数部分。即b转化成123。
所以,这里的a = = b是返回True。
所以这里我们只需要提供一个参数?key=123就可以拿到flag了
2.[RoarCTF 2019]Easy Calc
(1)打开 环境后显示一个计算的页面(2)发现有一个calc.php文件,并且提示设置了waf
先尝试访问calc.php(3)打开calc.php文件,发现是它之下的另一个源码 它的意思应该是用get方式传参赋值给num,并且使用正则表达式进行了过滤,只要能绕过过滤,就可以通过eval进行任意php语句
(4)尝试直接?num=phpinfo()
禁止访问,应该是waf起了作用,根据大佬们的wp知道可以通过在num前加一个空格进行绕过
原理:php解析规则:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行解析,假如waf不允许num变量接收字母,那么使用 num就可以,而php解析时就会自动把空格去掉
(5)尝试? num=phpinfo()
(6)使用scandir查看目录中的内容,找到存有flag的文件
? num=var_dump(scandir(chr(47)))
var_dump()方法是判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型.
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
(7)发现貌似flag文件,直接用相同方式访问,打开即可得到flag
3.[极客大挑战 2019]BuyFlag
(1)打开环境后如下(2)浅看了一眼啥也没有的样子,直接看看源代码,貌似也不是那么有用
(3)再次回来发现右上角有菜单,点进去看到它简述了flag获取 中文意思就是:如果你想要买这个flag:你必须是来自CUIT的学生;你必须输入正确的密码
(4)再看看这里的源码
阅读源代码可以得出:
变量password
使用POST
的传参方式进行传参,不难看出来,只要$password == 404
为真,那么,就可以绕过。函数is_numeric()
判断其中的参数是数字还是其他,如果是数字则判断为真,否则为假。这里我选择传入的参数为404a
(5)这里我直接用hackbar传个参
(6)然后用BP抓包
(7)看了一下抓包情况,关于用户的提示只有在cookie:user=0
,那我们将其换为1
试试
(8)可以看到提示——说我们的身份及密码正确,黑客,买flag
,那我们再根据提示,支付money
,使用post
传参password=404a&money=100000000
(9)然后他它提示说长度太长了,那就换个短点的试试
(10)然后它又说我们的money不够
查看一下php版本,看看有没有啥可以利用的点
(11).可以看到PHP的版本为:PHP/5.3.3,可以利用函数strcmp(),使用数组绕过password=404a&money[]=1000 然后成功拿到flag
4.[BJDCTF2020]Easy MD5
(1)打开环境后是一个提交页面,尝试了各种数据提交,发现啥有用的信息都没有,(2)看看源码也没有啥有用信息
(3)决定抓包看看
(4)得到有用信息
Hint: select * from 'admin' where password=md5($pass,true)
可知,数据再存入数据库之前使用了md5加密
我们在输入框中提交ffifdyop,会出现如下页面:
(5)这里使用:科学计数法(0e绕过)(绕过思路2)的方法绕过
构造payload:
http://3b2544a9-a3eb-4b09-87a8-f28609d74d0d.node4.buuoj.cn:81/levels91.php?a=QNKCDZO&&b=240610708
(6)最后是一个需要post提交的强比较,使用数组绕过 param1[]=2¶m2[]=3
绕过之后即可解出flag
原理:
ffifdyop经过md5加密后会变成276f722736c95d99e921722cf9ed621c
再转换为字符串:'or'6(乱码) 即 'or'66�]��!r,��b
预想,数据库查询语句应为:
SELECT * FROM xxx WHERE username = 'admin' and password = ".md5($password,true)."
而在mysql中,在用作布尔型判断时,以数字开头的字符串会被当成整型,不过由于是字符串,因此后面必须要有单引号括起来的,比如:‘xxx’or’6xxxxxx’,就相当于’xxx’or 6,就相当于 'xxx’or true,所以返回值是true。
所以,此时查询语句就会变成:
select * from xxx where user='amdin' and password=''or'6xxxx'
也就是,password=' ' or true=true