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了。

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

原文地址:https://www.cnblogs.com/hguone/p/14330098.html