web题目实操 5(备份文件和关于MD5($pass,true)注入的学习)

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&param2[]=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

  • 25
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值