[ACTF2020 新生赛]BackupFile——备份文件
由题目可提示,这道题的考点是备份文件
常见的备份文件后缀名有: .git .svn .swp .~ .bak .bash_history。
逐一尝试常见的备份文件后缀名,发现为.bak
,页面随即跳转到网页源码。
/index.php.bak
PHP中的弱类型比较
==
仅比较两个变量的值
===
比较两个变量的值和类型
源码中要求get
传参传入变量key
,传入的key
与$str
作弱比较,且要求传入的变量均为数字,于是令key=123
即可得到flag
。
[HCTF 2018]admin
点击HCTF
点击404:Not Found
,页面没有任何跳转。
页面有右上角有两个按钮,登录和注册
访问登录的页面
再访问注册的页面
注册时随便输入一个账号和密码,我输入的账号和密码均为123
(第一次注册时使用admin
提示已经被注过),使用注册成功的账号密码进行登录。
这种方法不可以,我们再次查看题目源码
<!-- you are not admin -->
猜测如果以admin
登录成功,则可能的到flag。我们在使用注册的账号登录成功后,发现右上角有三个按钮
我们三个操作均尝试并查看网页源码,寻找可用的信息。
index
页面和之前的index
页面查看源代码是一样的。
posts
页面进入只会显示404
,就算再后面新增了文章也是一样。
edit
页面是一个类似博客编写页面,有两个文本框,但试了一下XSS
都被过滤了。
change
页面是一个修改密码的页面。可能存在逻辑漏洞,尝试一下发现不需要输入之前的密码直接输入新密码就行,这样就不存在多步骤校验可能存在的逻辑绕过。而且查看报文发现报文中没有写用户名,里面只有一个新密码。证明用户名是通过session
来获取的,所以也不存在中间截获修改的漏洞。
Session
:
在计算机中,尤其是在网络应用中,称为“会话控制”。Session
对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web
页之间跳转时,存储在Session
对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web
页时,如果该用户还没有会话,则Web
服务器将自动创建一个Session
对象。当会话过期或被放弃后,服务器将终止该会话。Session
对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session对象中。
session的工作原理:
(1)当一个session
第一次被启用时,一个独一的标识被存储于本地的cookie
中。
(2)首先使用session_start()
函数,PHP
从session
仓库中加载已经存储的session
变量。
(3)当执行PHP
脚本时,通过使用session_register()
函数注册session
变量。
(4)当PHP
脚本执行结束时,未被销毁的session
变量会被自动保存在本地一定路径下的session
库中,这个路径可以通过php.ini
文件中的session.save_path
指定,下次浏览网页时可以加载使用。
我们在change password
选项的网页源码中发现了一个有关github
的网址,尝试访问。
下载该网站的flask
文档【Flask
是一个用 Python
编写的Web应用程序框架】,并解压
解压后打开文件夹的index.html
文件,
{% if current_user.is_authenticated and session['name'] == 'admin' %}
<h1 class="nav">hctf{xxxxxxxxx}</h1>
只要从session
中得到的值name
为admin
就会显示flag
,即能够使用admin
登录即可拿到flag
。
方法1
继续审代码,在routes.py
文件中,发现了strlower
小写函数,猜测如果使用ADMIN
进行注册,即可登录成功获得flag
。
方法2
直接抓包使用burp
来爆破字典获得密码123
。
[极客大挑战 2019]BuyFlag——PHP函漏洞
打开链接为三叶草安全技术小组的招新信息。
查看网页源码,发现了index.php
和pay.php
。
访问index.php
,与之前的网页没什么不一样。访问pay.php
,发现了提示得到flag
的条件
查看网页源代码,发现了一段注释
在控制台发现user
值只有一个值为0
修改user
的值为1
时,页面发生了变化
由于上面源码中注释的内容为POST
传参,则使用post方式传入money=100000000&password=404
,提示password不能为数字。
再次传入money=100000000&password=404mach
,则提示密码太长
这里对字符进行了判断,对字符处理的函数在PHP漏洞中比较常见,使用数组进行传参来绕过判断即可得到flag
。
money[]=1&password=404mach