ctf学习笔记 day03 新手练习

攻防世界 web 新手

一、simple_php(php特性漏洞

<?php
show_source(__FILE__);
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;
}
?> 

is_numeric() 函数用于检测变量是否为数字或数字字符串。
数字和数字字符串则返回 TRUE,否则返回 FALSE
而因为PHP中有两种比较符号

=== 会同时比较字符串的值和类型
== 会先将字符串换成相同类型,再作比较,属于弱类型比较

abcd==0为真
1235是数字,但加了字母后1235abcd在不比较的时候就不是数字,
在比较的时候,PHP进行类型转换后又和1235相等

http://...:xxxx/?a=abcd&b=1235abcd
在这里插入图片描述

二、weak_auth

在这里插入图片描述题解:
1.随便输入下用户名和密码,提示要用admin用户登入,然后跳转到了check.php,查看下源代码提示要用字典。
2.用burpsuite截下登录的数据包,把数据包发送到intruder爆破
2.设置爆破点为password
3.加载字典
4.开始攻击,查看响应包列表,发现密码为123456时,响应包的长度和别的不一样.
5.点进去查看响应包,获得flag

三、simple_js

<html>
<head>
<title>JS</title>
<script type="text/javascript">
        function dechiffre(pass_enc){
                var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
                var tab  = pass_enc.split(',');
                var tab2 = pass.split(',');
                var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
                k = j + (l) + (n=0);
                n = tab2.length;
                for(i = (o=0); i < (k = j = n); i++ ){
	                 o = tab[i-l];
	                 p += String.fromCharCode((o = tab2[i]));
	                 if(i == 5)break;
                }
                for(i = (o=0); i < (k = j = n); i++ ){
                	o = tab[i-l];
                	if(i > 5 && i < k-1)
                  		p += String.fromCharCode((o = tab2[i]));
                 }
                p += String.fromCharCode(tab2[17]);
                pass = p;
                return pass;
        }
        String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
        h = window.prompt('Enter password');
        alert( dechiffre(h) );
</script>
</head>
</html>

代码分析

k = j + (l) + (n=0)即k = j
k = j = n即j=n,k=n

两个循环即

for(i = 0; i < n; i++ ){
    p += String.fromCharCode(tab2[i]);
    if(i == 5)break;
}
for(i = 0; i < n; i++ ){
    if(i > 5 && i < k-1)
            p += String.fromCharCode(tab2[i]);
}

又k=n=tab2.length
再对两个循环合并即

for(i = 0; i < tab2.length-1; i++ ){
    p += String.fromCharCode(tab2[i]);
}

再加上p += String.fromCharCode(tab2[17]),tab2.length=17
可得

function dechiffre(pass_enc){
      var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
      var tab2 = pass.split(',');
      var i=0,p = "";
      for(i = 0; i < tab2.length-1; i++ ){
              p += String.fromCharCode(tab2[i]);
      }
      return p;
}

可见在逻辑上它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串。
由于只对pass处理,所以不论输入什么都是输出"70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"对应的Unicode字符串“FAUX PASSWORD HAH

将代码修改,使得可疑字符串通过该函数解码,即可得到题解。
(在浏览器F12打开开发者工具,直接在控制台执行以下js代码)

function dechiffre(pass_enc){
     var tab2 = pass_enc.split(',');
     var i=0,p = "";
     for(i = 0; i < tab2.length-1; i++ ){
         p += String.fromCharCode(tab2[i]);
     }
     return p;
 }
 var flag=dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30");
 alert("Cyberpeace{"+flag+"}");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值