CTF学习笔记(巨菜)

August 18, 2019 · 默认分类 · 学习笔记 · 641次阅读

0x00 废话

众所周知,打CTF就是享受被强奸到高潮那一秒的快感.

0x01 碰到的几个常见题型

PHP弱等于==

2019-08-19T10:44:27.png

PHP中的弱类型比较
==在进行比较的时候,会先将字符串类型转化成相同,再比较。而===则要求数据类型一致,值一致才返回true

<?php 
include("config.php"); 
$a=@$_GET['a']; 
$b=@$_GET['b']; 
if($a==0 and $a){ 
    echo $flag1; 
} 
if(is_numeric($b)){ 
    exit(); 
} 
if($b>1234){ 
    echo $flag2; 
} 
?> 

比如这个题(来自攻防世界),这里$a==0 and $a要求a的值为0但是and前后的值必须都为true(就是说$a不能直接等于0,0=false)
这里让$a的值为0a,在$a==0的比较中.强制让$a转化为数值形式,所以就等于0.让$a的值
参考于PHP官方手册

13546546
接着那个$b的判断,要求$b不是数字但是又得大于1234,这里也是一样的,$b=12345a,最终得到flag

变量覆盖

这里挑一个中学生CTF的题做例子

<?php
include 'flag.php';

if($_SERVER['REQUEST_METHOD'] == "POST"){
    $secretKey = rand();//给变量赋值个随机数
    extract($_POST);

    if($password == $secretKey){
        echo '<br>'.$flag;   
    }else{
        echo "<br>Try again!";   
    }    
}
?>

extract()函数使用post的数组键名作为变量名,使用数组键值作为变量值.针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
比如我们post内容为$password=1&$secrekey=1,这个函数就会去创建一个值为1的password的变量.可以这么理解:

if($_SERVER['REQUEST_METHOD'] == "POST"){
    $secretKey = rand();//给变量赋值个随机数
    extract($_POST);//$password=1;$secretkey=1;

这样就覆盖掉了之前secretkey的随机值.
其实变量覆盖类型挺多的,不止extract这一种.其他的我也没咋碰到过(CTF萌新),看了些网上的例子,也不算刁钻.

create_function造成的代码执行

语法

create_function(string $args,string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分

create_function()函数会在内部执行 eval()

$str = 'phpinfo()';
create_function('', '$str');
//上面的代码就相当于
function name(){
    eval('phpinfo()');
} 

CTF实例:

if (isset($_GET['code'])) {  
          $func = create_function('', $_GET['code']);  
          if ($_GET['code'] === "echo 'Hello World';") {  
            $func();  
          }  
//payload:code=}phpinfo();/*
//原来的create_funtion实质上:
function name(){
     $_GET['code']
}
//注入后:
function name(){
    }phpinfo();/*
}
//这里这个大括号,不是闭合if的大括号,实际上是闭合这里,然后phpinfo语句单独了出来

PHP中的{}


$yourinput = $_GET['cmd'];
$funcs_internal = get_defined_functions()['internal'];

function helper($d){
    return base64_decode($d);
}

$who = "ZmxhZw==";//用helper函数解码即可得到字符串flag

$funcs_extra = array ('eval', 'include', 'require', 'function');
$funny_chars = array ('\.', '\+','flag', '-', '\*', '"', '`', '\[', '\]', '@', '!', '#', '%', '&', '~');
$variables = array ('_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_FILES', '_ENV', 'HTTP_ENV_VARS', '_SESSION', 'GLOBALS');
$blacklist = array_merge($funcs_internal, $funcs_extra, $funny_chars, $variables);

$hacked = false;
$why = "";
foreach ($blacklist as $blacklisted) {
    if (preg_match ('/' . $blacklisted . '/im', $yourinput)) {
        $hacked = true;
        $why = $blacklisted;
        break;
    }
}


if ($hacked) {
    die('Hacker Detected,<br/>Reason: '.$why." !");
} else {
    if(isset($yourinput)){
           @eval("echo " . $yourinput . " ;");
    }else{
        echo "Input your command!";
    }
}
//一部分代码省略了

过滤了很多符号
这个题,?cmd=helper($who);输出一个字符串flag,然后要在这个字符串前面加个$,就可以被后面的eval输出了.
就利用了大括号的一个特性:表示{}里面的是一个变量 ,执行时按照变量来处理
例子:

<?php
$a = 'asd';
echo "{$a}123";//asd123 
?>

所以最后的payload:?cmd=${helper($who)}

再说几个常考的misc和crypto

brainfuck

+-[]<>.组成

66666
加密后
++++++++[>>++>++++>++++++>++++++++>++++++++++>++++++++++++>++++++++++++++>++++++++++++++++>++++++++++++++++++>++++++++++++++++++++>++++++++++++++++++++++>++++++++++++++++++++++++>++++++++++++++++++++++++++>++++++++++++++++++++++++++++>++++++++++++++++++++++++++++++<<<<<<<<<<<<<<<<-]>>>>++++++.....

jsfuck

[]+!组成

123123
加密后
[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]

XXencode

特点不明确

to1y5
加密后
3R4wlSHI+

UUencode

to1y5
加密后
%=&\Q>34 

AAencode

颜文字组成

to1y5
加密后
゚ω゚ノ= /`m´)ノ ~┻━┻   //*´∇`*/ ['_']; o=(゚ー゚)  =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\'; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];(゚Д゚) [゚o゚]='\"';(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o^_^o) +(o^_^o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ ((゚ー゚) + (o^_^o))+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (o^_^o))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((o^_^o) +(o^_^o))+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚o゚]) (゚Θ゚)) ('_');

核心价值观编码

特点过于突出

to1y5
加密后
法治自由公正友善敬业和谐民主法治敬业和谐平等

猪圈密码

2019-08-17T15:43:01.png

栅栏密码

栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文

to1y5
加密后(两位一组)
t15oy

凯撒密码

加密方式:把每个字母向后移x位

ttt
加密后(后移两位)
vvv

最后

差不多就小结到这吧,学习笔记,能帮助到人更好.

标签:none

最后编辑于:2019/08/25 01:27