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:\n\n%s=%d\n' % (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了。
————结束撒花————