第十周buuctf

[ACTF2020 新生赛]BackupFile

题目类型:备份文件

知识点

==是不判断二者是否是同一数据类型,而===是更为严格的比较,它不仅要求二者值相等,而且还要求它们的数据类型也相同。
常见的备份文件后缀:.rar .zip .7z .tar .gz .bak .swp .txt .html
is_numeric函数用于检测变量是否为数字或数字字符串
intval() 函数用于获取变量的整数值
数字 加 字母等非数字转换

var s = ‘234string’;
parseInt(s); //234
parseFloat(s); //234.0

第十周buuctf_第1张图片
用dirsearch扫一下目录:python dirsearch.py -u 3943f78f-4c3d-4d7c-8728-9f59f4527095.node4.buuoj.cn:81 -e php

访问index.php.bak
第十周buuctf_第2张图片
出现PHP代码

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    //is_numeric函数用于检测变量是否为数字或数字字符串
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    //intval() 函数用于获取变量的整数值
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}



代码审计:通过key变量get传参,要求此变量必须是数字,且取整数之后值为123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3
取key的值为123

第十周buuctf_第3张图片

[RoarCTF 2019]Easy Calc

第十周buuctf_第4张图片
查看源码
第十周buuctf_第5张图片
抓包
第十周buuctf_第6张图片
发现calc.php,访问一下
第十周buuctf_第7张图片
有个黑名单

上面是我所有收集到的信息,然后源码有部分也看不懂,不知道该怎么下手,甚至还不知道这是个什么类型的题目,下面开始学习大佬

知识点:

chr() 函数:从指定的 ASCII 值返回字符。 ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置0,而十六进制值被定义为带前置 0x。
file_get_contents() 函数:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
scandir() 函数:返回指定目录中的文件和目录的数组。

查看源码

第十周buuctf_第8张图片
$(“#content”).val()相当于 document.getElementById(“content”).value;
方法一:PHP的字符串解析特性
尝试一下/calc.php?num=phpinfo()
第十周buuctf_第9张图片
PHP的字符串解析特性:PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:1.删除空白符 2.将某些字符转换为下划线(包括空格)【当waf不让你过的时候,php却可以让你过】。假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

num前加个空格:/calc.php? num=phpinfo()

第十周buuctf_第10张图片
由于“/”被过滤了,所以我们可以使用chr(47)来进行表示,进行目录读取:

calc.php? num=1;var_dump(scandir(chr(47)))

第十周buuctf_第11张图片
构造

:/flagg——chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
payload:calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

第十周buuctf_第12张图片

[极客大挑战 2019]BuyFlag

第十周buuctf_第13张图片
第十周buuctf_第14张图片
查看源码

第十周buuctf_第15张图片
代码审计:以post方式传参,money=100000000,password满足等于404,但是不能为数字,所以password等于404+任意字符
使用burpsuite抓包

总结一下需要满足四个条件:前面提示必须是cuit的学生;以post方式传参;money=100000000;password=404a。

所以修改cookie里的user=0user=1

第十周buuctf_第16张图片

password=404a&money=1e9

第十周buuctf_第17张图片

[护网杯 2018]easy_tornado

首先出来三个链接
第十周buuctf_第18张图片

flag.txt

第十周buuctf_第19张图片

提示flag在/fllllllllllllag中
知道了第一个条件,filename=/fllllllllllllag
查看welcome.txt
第十周buuctf_第20张图片

查看hints.txt
第十周buuctf_第21张图片

分析一下
在这里插入图片描述

这里有两个参数,第一个参数filename,文件的名称,我们通过查看flag.txt文件知道,藏flag的文件名为fllllllllllllag;第二个参数filehash,翻译一下:文件哈希,也就是加密了

加密方法在第三个文件中md5(cookie_secret+md5(filename)),将cookie_secret+filename的值md5加密后的值,整体再md5加密;然后把最后的值赋给filehash

现在最重要的一步就是获取cookie_secret的值,这个我不会。看一下大佬们怎么做

在试的过程中,尝试只输入filename的值而忽略filehash,结果出来以下内容,URL变成/error?msg=Error

render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 ,如果用户对render内容可控,不仅可以注入XSS代码,而且还可以通过{{}}进行传递变量和执行简单的表达式。
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。

大佬解法:
由于是python的一个模板,首先想到的就是模板注入{{}},最终找到的位置是报错网页(随便访问一个文件是更改它的签名就可以进入),里面的参数msg。
render是模板注入,经过测试发现过滤了。构造payload:/error?msg={{1*2}}

第十周buuctf_第22张图片

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

构造payload/error?msg={{handler.settings}}

第十周buuctf_第23张图片
找到cookie_secret为6e6e371d-7445-46db-8066-46e0e25c8b7a

filename的值md5加密后为3bf9f6cf685a6dd8defadabfb41a03a1
cookie_secret+filename加密后的值为9ff081746c35f525a315a313ac1a00d8
构造payload:/file?filename=/fllllllllllllag&filehash=9ff081746c35f525a315a313ac1a00d8

在这里插入图片描述

[BJDCTF2020]Easy MD5

第十周buuctf_第24张图片
查看源代码没有什么发现,抓包看一看

第十周buuctf_第25张图片
线索暗示:Hint: select * from 'admin' where password=md5($pass,true)

md5(string,raw)

string 必需。规定要计算的字符串。
raw 可选。规定十六进制或二进制输出格式: TRUE - 原始 16 字符二进制格式;FALSE - 默认。32 字符十六进制数

现在需要构造or来绕过password,md5(ffifdyop,true)='or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c
原sql查询语句则变为select * from user where username ='admin' and password =''or'6\xc9]\x99\xe9!r,\xf9\xedb\x1c'即可绕过
类似的字符串还有:md5(129581926211651571912466741651878684928,true)=\x06\xdaT0D\x9f\x8fo#\xdf\xc1'or'8
在输入ffifdyop后,出现

第十周buuctf_第26张图片
查看源码:
第十周buuctf_第27张图片
这里就需要知道一个知识点:md5加密后的值开头为0E是他们的值相等

/levels91.php?a=s878926199a&b=s155964671a

出现以下提示

第十周buuctf_第28张图片
我们访问levell14.php
第十周buuctf_第29张图片
这里用php数组绕过,由于哈希函数无法处理php数组,在遇到数组时返回false,我们就可以利用false==false成立使条件成立。

param1[]=1&param2[]=2

第十周buuctf_第30张图片

你可能感兴趣的:(php,开发语言)