zoukankan      html  css  js  c++  java
  • hackinglab CTF题 脚本关

    ————1、key又又找不到了————

    我不知道我有没有get到脚本关的点,反正习惯进地址抓了个包,重放一下就出来了

    ————2、快速口算————

     我试了,一点进去就输内容点提交还是会显示时间要在2秒内。

    这关很脚本,我估摸着要写一个python,然后我没写,我找了个别人写的。

    import re #正则模块
    import requests
    
    s = requests.Session()  
    url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
    r = s.get(url)
    r.encoding = 'utf-8'   #修改编码
    print(r.text)
    num = re.findall(re.compile(r'<br/>s+(.*?)='), r.text)[0]  #正则表达式找到算术式
    
    print ('result:
    
    %s=%d
    ' % (num, eval(num)))  #输出算术式计算结果
    r = s.post(url, data={'v': eval(num)})  #将结果提交  抓包可看出要用v提交
    print (r.text)  #输出返回结果

    看了下思路是下载url内容,然后从内容里正则匹配算术式,正则的写法根据源代码分析,然后计算找的的算术式,用post请求给v赋值,查看响应包结果。

    直接跑python得到结果如下

     ————3、这个题目是空的————

     常识题,什么是空,NULL,要小写,所以是null

    ————4、怎么就是不弹出key呢?————

    进去看了源代码,发现里面有函数

     复制下来做一个新的html,分析了一下发现第一个function没用,直接删了,得到如下

     浏览器访问,点击链接触发弹窗

     

     注意要前14个字符,同时由

     这行代码可知还得从chars之后开始算

    ————5、逗比验证码第一期————

     有没有都一样的话,那就是不失效,直接抓包爆破

     

     ————6、逗比验证码第二期————

     会失效的验证码,抓包看一下

     复用的话还真是,会显示验证码错

     在参数做手脚,到验证码vcode参数的时候发现没有数值就不检测了

     继续爆破

     ————7、逗比的验证码第三期(SESSION)————

     我好像没有get到这个题的点,用和第六题一样的方式爆破就出来了

    ————8、微笑一下就能过关了————

     进去以后发现可以看过关源代码

     进去一看是这样的内容

     <?php  
        header("Content-type: text/html; charset=utf-8");
        if (isset($_GET['view-source'])) { 
            show_source(__FILE__); 
            exit(); 
        } 
    
        include('flag.php'); 
    
        $smile = 1;  
    
       if (!isset ($_GET['^_^'])) $smile = 0;  
        if (preg_match ('/./', $_GET['^_^'])) $smile = 0;  
        if (preg_match ('/%/', $_GET['^_^'])) $smile = 0;  
        if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0;  
        if (preg_match ('/http/', $_GET['^_^']) ) $smile = 0;  
        if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0;  
        if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0;  
        if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0;  
        if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0; 
        if ($smile) { 
            if (@file_exists ($_GET['^_^'])) $smile = 0;  
        }  
        if ($smile) { 
            $smile = @file_get_contents ($_GET['^_^']);  
            if ($smile === "(●'◡'●)") die($flag);  
        }  
    ?>  
    <!doctype html> 
    <html lang="en"> 
    
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Show me your smile :)</title> 
    <link rel="stylesheet" href="style.css"> 
    </head> 
    
    <body> 
    <br><br><br><br><br><br><br> 
    <div class="loginform cf"> 
        <form name="login" action="index.php" method="POST" accept-charset="utf-8"> 
            <ul> 
                <li> 
                    <label for="SMILE">请使用微笑过关<a href="?view-source">源代码</a></label> 
                    <input type="text" name="T_T" placeholder="where is your smile" required> 
                </li> 
                <li><input type="submit" value="Show"> </li> 
            </ul> 
        </form> 
    </div> 
    <div style="text-align:center;clear:both"> 
    </div> 
    </body> 
    
    </html>  

    主要是这部分

     分析一下大概是

    1、不能交"^_^"

    2、"^_^"类似一个参数,要像name=xxx一样要给"^_^"赋值

    3、"^_^"的值不能有"."、"%"、0-9的数字、"https"、"http"、"ftp"、"telnet"

    4、"^_^"这个参数不能含有"_",即需要编码

    5、file_get_contents($_GET['^_^'])等于(●'◡'●)

    6、$_GET['^_^']文件不存在

    所以^_^的内容只能是字符串(●'◡'●),不能是某个含有(●'◡'●)的文件的文件名

    以此传给file_get_contents函数比较符合是data://

    所以编码再加上类型加上内容

    构造payload得到?%5e%5f%5e=data:,(●'◡'●)

    在URL后添加访问得到

     ————9、逗比的手机验证码————

     进入以后正常拿验证码登录,会得到如下信息

     返回将账号修改为13388886667,会显示

    重新用13388886667获取验证码,抓包,然后修改电话为13388886666,放包

    本地会弹窗验证码

     登录获得key

     ————10、基情燃烧的岁月————

     首先就是正常获取验证码,结果显示

     然后爆破就行了

     会有一个新手机号,新手机继续爆破完事

     ————11、验证码识别————

     这个题如其名,就是爆破加验证码识别,可以用python写脚本,我库没弄好

    改用验证码识别工具,我用的是burp的插件,调用了云平台的识别api识别验证码

    首先复制验证码图片地址,访问,抓包

     然后把这个包发到插件

     就可以获取验证码了

     然后配置云平台的api,我已经配好了

     配置好正则识别内容,就可以识别了,识别结果如下

    然后就可以登陆界面爆破了,模式选择

     然后验证码参数选择插件

     开始爆破

     插件github地址为:https://github.com/c0ny1/captcha-killer

    里面有下载和使用教程

    ————12、XSS基础关————

     进去发现是反射型的xss

     直接构造payload执行

    <script>alert(1)</script>

     会提示弹这个内容

     重新构造payload

    <script>alert(HackingLab)</script>

     提示成功,页面会显示key

     ————13、XSS基础2:简单绕过————

     绕过一开始试了各种大小写和编码,发现srcipt标签是不行了

    随便试了一个别的payload

    <img src=? onerror=alert(HackingLab) />

    提示成功,显示key

     ————14、XSS基础3:检测与构造————

    看到构造就知道肯定是返回数据,然后要闭合符号啥的

    直接做了个测试,查询了wuyanzu

     看源码发现在这里

     于是直接引号闭合标签,后面构造弹窗

    好家伙,直接过滤了

    检测了一下发现<script>标签过滤了

    用上一题的方法,发现img这个方式也过滤了

    但是单纯的img src这些都不过滤,我怀疑是alert

    于是乱输了一堆东西以后发现不检测

     

    那是alert的问题,但是单纯alert()也不报问题,试了几下发现在alert的前面拼其他东西比如"="这种会报问题

    然后我就试着和引号(因为要考虑闭合)一起拼,还是报问题,然后发现拼在alert后面不报问题

    好到这里分析都没什么用,接下来

    我就用了两个alert中间拼引号,这样一个alert来说引号是在后面的,对另一个来说引号是在前面的,那会是什么情况

    好家伙,不报问题,也就是说源代码里value引号内给他一个alert就可以堵住检测机制的嘴了?

    换个方式说,难不成它只检测一次,匹配到,在引号内就没事,不在就报问题,检测程序就结束了?

    然后我用payload

    alert'><'<img src=? onerror=alert(HackingLab) />

    发现后面一串没写进去,就是尖括号闭合后后面写不进东西,那么索性直接在后面拼接一个事件

    alert' onclick=alert(HackingLab)>

    这个意思是鼠标点击框框以后会弹窗,点击后弹出

    ————15、Principle很重要的XSS————

     上一题分析了可能只检测一次,引号内没问题,引号外会出事,在这里就再用一下

    alert' onclick=alert(HackingLab)>

    然后检测出来了,额

    接下来步骤特别关键

    然后我不甘心就重新输了一遍,然后输错了,少了个空格

    alert'onclick=alert(HackingLab)>

    然后就成功了,牛逼

     但是用鼠标点击事件的话,点那个链接虽然是success,但是会跳到404

     所以我换了一个事件,鼠标经过就会触发

    alert'onmouseover=alert(HackingLab)>

     最后分析一波原因,我觉得大概是,可能是,应该是,空格吧,因为我删了个空格就行了

    检测程序应该不是检测一次而已了,应该是检测多次,第一次检测到引号内的alert没事,然后隔着空格找到了下一个字符串检测里面的alert

    但是空格去掉,他就把这一整串当成一个字符串,emmmm

    那就是说,它检测一行里面有许多子字符串的字符串是检测多次的,通过空格,分别检测每个子字符串

    比如这样一串字符串

    alert' haalertha haha

    检测程序它会对alert',haalertha,haha分别检测。

    但是对每个子字符串他就检测一次alert,检测到在引号内没毛病就停止了,不在引号内就报问题

     还是这一串字符串

    alert' haalertha haha

    检测alert',引号闭合,在引号内的alert就没事,但是检测haalertha,检测到闭合后在引号外还有alert,所以会报问题

    而对每个子字符串他就检测一次的意思是对于这种字符串alert'alert

    检测到第一个alert在引号闭合内所以没事,然后对于这个子字符串的检测就停止了,对后面那个alert没有再管,因为已经在检测一次alert了。

    ————结束撒花————

  • 相关阅读:
    java int转byte数组
    业务网关-操作手册
    业务网关-配置
    H2数据库的导入、导出(CSV)
    sequelize踩坑处理:时间格式化
    引入koa-static处理静态资源
    MySql利用case when实现批量更新多条记录的不同值实现方法
    Sequelize增删改查及批量新增或批量更新(bulkCreate的updateOnDuplicate)等常用接口
    数据结构队列、双端队列、队列系算法题解析
    配置webpack中externals来减少打包后vendor.js的体积
  • 原文地址:https://www.cnblogs.com/hguone/p/14330098.html
Copyright © 2011-2022 走看看