题目来源:首页 - Bugku CTF
一、php代码基础
1、简介
php的变量不需要先声明再调用,以$开头,后面直接接变量名,例如&a表示变量a。
$a='a';
$b="aaa";
echo $b[1];//输出结果为a
php8种变量类型
2、php弱类型问题
= 赋值;
== 弱类型比较(先将两端数值转换再比较)ctf常在这里出题
=== 强类型比较(不转换,直接比较)
“0e+纯数字”,结果为0,例如“0e123”按照科学计数法处理(0e123=0*10的123次方=0)
于是有:“0e123”==“0e456” //true
“0e123a”==“0e456” //false(0e之后非全数字,当做字符串比较)
所以前人为我们有一些总结如下表:
字符串 | md5值 |
QNKCDZO | 0e830400451993494058024219903391 |
s878926199a | 0e545993274517709034328855841020 |
s155964671a | 0e342768416822451524974117254469 |
s214587387a | 0e848240448830537924465865611904 |
s214587387a | 0e848240448830537924465865611904 |
s878926199a | 0e545993274517709034328855841020 |
s1091221200a | 0e940624217856561557816327384675 |
s1885207154a | 0e509367213418206700842008763514 |
显而易见,依据上述规则,表中字符串MD5值相同,字符串不同
2、我们以一道题目的php代码开始(题目参考:备份是个好习惯):如下
题目如下,是一段编码,解码也没有发现什么提示,考虑其他办法
懵逼了,怎么办,后台扫一扫把,扫描发现有个bak文件,bak正好是备份文件,这不就是题目吗?点进去看看,发现是段代码。
代码如下:
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/
include_once "flag.php"; 引入一个名为flag.php的外部文件,这个文件可能定义了变量$flag。
ini_set("display_errors", 0); 设置PHP配置,关闭错误显示,这样如果代码执行出错,错误信息不会显示在页面上。
$str = strstr($_SERVER['REQUEST_URI'], '?'); 从请求的URI中查找?字符及其之后的字符串。
$str = substr($str,1); 去掉字符串的第一个字符(即?字符)。
$str = str_replace('key','',$str); 删除字符串中的所有key字样。
parse_str($str); 将字符串解析成变量,例如a=1&b=2会被解析为$a=1和$b=2。
echo md5($key1); 输出变量$key1的MD5散列值。
echo md5($key2); 输出变量$key2的MD5散列值。
if(md5($key1) == md5($key2) && $key1 !==$key2){ 判断$key1和$key2的MD5散列值是否相等,并且$key1和$key2本身不相等。
echo $flag."取得flag"; 如果条件成立,输出变量$flag的值和字符串取得flag。
}
?>
上述代码,最后能够输出的要求是$key1和$key2的MD5值相等,但是$key1和$key2不等。
这样,那我们在url中构造:key1=QNKCDZO&key2=s878926199a
输入发现没弹回flag,我们再看代码,发现代码还要求在?之后,还要删除字符串中的key,那么怎么能在删除key之后得到?key1=QNKCDZO和key2=s878926199a,必然是在这之中在写一个让他删除呗,所以构造
?kkeyey1=QNKCDZO和kkeyey2=s878926199a
在你的url中直接写上,得到flag了