HackingLab脚本关思路
前言
本人也是第一次写这种CTF的writeup,可能会存在一定的错误和遗漏之处,本攻略主要是提供解体思路,尽量会避免直接显示答案,请各位见谅,但是如果有一些直接显示在响应包中的key,本攻略则会直接显示。以下攻略部分代码和思路引用自其他人的博客或者网站,大部分以注明出处,如有遗漏,烦请告知,谢谢~
更新时间为2017.01.09,所有关卡题目攻略皆已补全
脚本关的题目大部分靠神器burp,其实很不应该,将来写脚本,回来review
作者:古月蓝旻
脚本关
Q1:
key又又找不到了
分值: 200
小明这次哭了,key又找不到了!!! key啊,你究竟藏到了哪里,为什么我看到的页面上都没有啊!!!!!
首先我们打开链接,发现给了一个
到这里找key
的链接,ok,我们去看一下
然后抓到了响应包
HTTP/1.1 200 OK
Server: sae
Connection: keep-alive
Date: Tue, 03 Jan 2017 08:41:33 GMT
Content-Type: text/html
Via: 15146
X-Daa-Tunnel: hop_count=1
Content-Length: 94
<script>window.location="./no_key_is_here_forever.php"; </script>
key is : yougotit_script_now
其实key就在这里了,但是我们放过这个包之后,发现页面跳转到了
http://lab1.xseclab.com/xss1_30ac8668cd453e7e387c76b132b140bb/no_key_is_here_forever.php
很神奇,其实关键就在于我们拦截的包里面有JS语句,使用window.location将页面跳转到了no_key_is_here_forever.php
,一旦抓包了,这个就无法躲藏了
简单尝试了一下,抓包将window.location修改成了www.qq.com同样可以跳转,这样可能导致中间人攻击?
所以这道题抓个包,看一下响应包即可
Q2:
快速口算
分值: 350
小明要参加一个高技能比赛,要求每个人都要能够快速口算四则运算,2秒钟之内就能够得到结果,但是小明就是一个小学生没有经过特殊的培训,那小明能否通过快速口算测验呢?
点进去之后发现是多个4位数以上的运算
请在2秒内口算结果并提交!
6864*12726+1440*(6864+12726)=
两秒钟提交?就算不看算式直接敲一个数也不只两秒啊,所以这题让脚本去解决是最合适的,直接使用python脚本,安装一下requests库吧
# coding=utf-8
import requests, re, sys
reload(sys)
sys.setdefaultencoding('utf-8')
url = 'http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php'
req = requests.session()
get = req.get(url)
r = re.findall(r'<br/>[\d|\D](.*?)=<', get.content)[0].strip()
print eval(r)
post = req.post(url, data={'v': eval(r)})
key = re.findall(r'<body>(.*?)</', post.content)[0].strip()
print key
这个脚本的含义很简单,使用python的requests库去访问题目的url,根据页面源码,提取算式部分,然后交给eval()函数进行运算,然后提交,最后key就会返回回来,直接打印输出即可
然后req=requests.session()的目的,查询了一下,是初始化一个session对象,然后使用这个session对象来进行访问
python中的requests库是居家旅行必备的强大库,内容非常厉害,下面附上简单的教程
这个脚本中正则的使用也非常值得学习
P.S.:据说控制台也可以实现2s内提交,但是我使用firebug的console就没有成功过...
Q3:
这个题目是空的
分值: 100
Tips:这个题目真不是随便设置的。 什么才是空的呢? 通关地址:没有,请直接提交答案(小写即可)
什么是空?NULL,NONE,0,-1,,FALSE...?
反正最后提交null就行了
Q4:
怎么就是不弹出key呢?
分值: 150
提交说明:提交前14个字符即可过关
嗯,关于这个问题,是想让我们点击链接然后跳出弹窗的,但是我们点击之后什么反应都没有,弹窗,很容易想到的就是JS的alert(),既然不弹窗,那么是不是网站的JS出现了问题呢,我们看看源码,有JS的代码,而且很长,其实那个一复杂的加密过程不是我们关注的重点,我们只用关注一下逻辑存在问题与否
源码
<script>
function alert(a){
return false;
}
document.write=function(){
return false;
}
function prompt(a){
return false;
}
var a=function (){
var b=function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1s(1e(p,a,c,k,e,r){e=1e(c){1d(c<a?\'\':e(1p(c/a)))+((c=c%a)>1q?1f.1j(c+1k):c.1n(1o))};1g(!\'\'.1h(/^/,1f)){1i(c--)r[e(c)]=k[c]||e(c);k=[1e(e){1d r[e]}];e=1e(){1d\'\\\\w+\'};c=1};1i(c--)1g(k[c])p=p.1h(1l 1m(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);1d p}(\'Y(R(p,a,c,k,e,r){e=R(c){S(c<a?\\\'\\\':e(18(c/a)))+((c=c%a)>17?T.16(c+15):c.12(13))};U(!\\\'\\\'.V(/^/,T)){W(c--)r[e(c)]=k[c]||e(c);k=[R(e){S r[e]}];e=R(){S\\\'\\\\\\\\w+\\\'};c=1};W(c--)U(k[c])p=p.V(Z 11(\\\'\\\\\\\\b\\\'+e(c)+\\\'\\\\\\\\b\\\',\\\'g\\\'),k[c]);S p}(\\\'G(B(p,a,c,k,e,r){e=B(c){A c.L(a)};E(!\\\\\\\'\\\\\\\'.C(/^/,F)){D(c--)r[e(c)]=k[c]||e(c);k=[B(e){A r[e]}];e=B(){A\\\\\\\'\\\\\\\\\\\\\\\\w+\\\\\\\'};c=1};D(c--)E(k[c])p=p.C(I J(\\\\\\\'\\\\\\\\\\\\\\\\b\\\\\\\'+e(c)+\\\\\\\'\\\\\\\\\\\\\\\\b\\\\\\\',\\\\\\\'g\\\\\\\'),k[c]);A p}(\\\\\\\'t(h(p,a,c,k,e,r){e=o;n(!\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\'.m(/^/,o)){l(c--)r[c]=k[c]||c;k=[h(e){f r[e]}];e=h(){f\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\w+\\\\\\\\\\\\\\\'};c=1};l(c--)n(k[c])p=p.m(q s(\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\b\\\\\\\\\\\\\\\'+e(c)+\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\b\\\\\\\\\\\\\\\',\\\\\\\\\\\\\\\'g\\\\\\\\\\\\\\\'),k[c]);f p}(\\\\\\\\\\\\\\\'1 3="6";1 4="7";1 5="";8(1 2=0;2<9;2++){5+=3+4}\\\\\\\\\\\\\\\',j,j,\\\\\\\\\\\\\\\'|u|i|b|c|d|v|x|y|j\\\\\\\\\\\\\\\'.z(\\\\\\\\\\\\\\\'|\\\\\\\\\\\\\\\'),0,{}))\\\\\\\',H,H,\\\\\\\'|||||||||||||||A||B||M||D|C|E|F||I||J|G|N|O||P|Q|K\\\\\\\'.K(\\\\\\\'|\\\\\\\'),0,{}))\\\',X,X,\\\'||||||||||||||||||||||||||||||||||||S|R|V|W|U|T|Y|13|Z|11|14|12|10|19|1a|1b|1c\\\'.14(\\\'|\\\'),0,{}))\',1t,1u,\'|||||||||||||||||||||||||||||||||||||||||||||||||||||1e|1d|1f|1g|1h|1i|1v|1s|1l||1m|1n|1o|1r|1k|1j|1q|1p|1w|1x|1y|1z\'.1r(\'|\'),0,{}))',62,98,'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||return|function|String|if|replace|while|fromCharCode|29|new|RegExp|toString|36|parseInt|35|split|eval|62|75|53|var|slakfj|teslkjsdflk|for'.split('|'),0,{});
var d=eval(b);
alert("key is first 14 chars"+d);
}
</script>
一大堆return false;代码怎么可能运行,这个时候我们可以使用控制台来修改一下JS代码,去掉所有的return false;
然后既然需要的是前14个字符,我们使用substr(0,14)函数帮忙即可,所以控制台代码如下
var a=function (){
var b=function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1s(1e(p,a,c,k,e,r){e=1e(c){1d(c<a?\'\':e(1p(c/a)))+((c=c%a)>1q?1f.1j(c+1k):c.1n(1o))};1g(!\'\'.1h(/^/,1f)){1i(c--)r[e(c)]=k[c]||e(c);k=[1e(e){1d r[e]}];e=1e(){1d\'\\\\w+\'};c=1};1i(c--)1g(k[c])p=p.1h(1l 1m(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);1d p}(\'Y(R(p,a,c,k,e,r){e=R(c){S(c<a?\\\'\\\':e(18(c/a)))+((c=c%a)>17?T.16(c+15):c.12(13))};U(!\\\'\\\'.V(/^/,T)){W(c--)r[e(c)]=k[c]||e(c);k=[R(e){S r[e]}];e=R(){S\\\'\\\\\\\\w+\\\'};c=1};W(c--)U(k[c])p=p.V(Z 11(\\\'\\\\\\\\b\\\'+e(c)+\\\'\\\\\\\\b\\\',\\\'g\\\'),k[c]);S p}(\\\'G(B(p,a,c,k,e,r){e=B(c){A c.L(a)};E(!\\\\\\\'\\\\\\\'.C(/^/,F)){D(c--)r[e(c)]=k[c]||e(c);k=[B(e){A r[e]}];e=B(){A\\\\\\\'\\\\\\\\\\\\\\\\w+\\\\\\\'};c=1};D(c--)E(k[c])p=p.C(I J(\\\\\\\'\\\\\\\\\\\\\\\\b\\\\\\\'+e(c)+\\\\\\\'\\\\\\\\\\\\\\\\b\\\\\\\',\\\\\\\'g\\\\\\\'),k[c]);A p}(\\\\\\\'t(h(p,a,c,k,e,r){e=o;n(!\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\'.m(/^/,o)){l(c--)r[c]=k[c]||c;k=[h(e){f r[e]}];e=h(){f\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\w+\\\\\\\\\\\\\\\'};c=1};l(c--)n(k[c])p=p.m(q s(\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\b\\\\\\\\\\\\\\\'+e(c)+\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\b\\\\\\\\\\\\\\\',\\\\\\\\\\\\\\\'g\\\\\\\\\\\\\\\'),k[c]);f p}(\\\\\\\\\\\\\\\'1 3="6";1 4="7";1 5="";8(1 2=0;2<9;2++){5+=3+4}\\\\\\\\\\\\\\\',j,j,\\\\\\\\\\\\\\\'|u|i|b|c|d|v|x|y|j\\\\\\\\\\\\\\\'.z(\\\\\\\\\\\\\\\'|\\\\\\\\\\\\\\\'),0,{}))\\\\\\\',H,H,\\\\\\\'|||||||||||||||A||B||M||D|C|E|F||I||J|G|N|O||P|Q|K\\\\\\\'.K(\\\\\\\'|\\\\\\\'),0,{}))\\\',X,X,\\\'||||||||||||||||||||||||||||||||||||S|R|V|W|U|T|Y|13|Z|11|14|12|10|19|1a|1b|1c\\\'.14(\\\'|\\\'),0,{}))\',1t,1u,\'|||||||||||||||||||||||||||||||||||||||||||||||||||||1e|1d|1f|1g|1h|1i|1v|1s|1l||1m|1n|1o|1r|1k|1j|1q|1p|1w|1x|1y|1z\'.1r(\'|\'),0,{}))',62,98,'|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||return|function|String|if|replace|while|fromCharCode|29|new|RegExp|toString|36|parseInt|35|split|eval|62|75|53|var|slakfj|teslkjsdflk|for'.split('|'),0,{});
var d=eval(b);
alert("key is first 14 chars"+d.substr(0,14));
}
使用firebug测试的时候,记得点击一下全部消息
Q5:
逗比验证码第一期
分值: 100
逗比的验证码,有没有难道不一样吗?
验证码有没有一个样?暗示的就是验证码是不会过期的,所以拿burp suite使用同一个验证码,密码从1000到9999,爆破即可,然后根据返回长度确定密码,可拿key
Q6:
逗比验证码第二期
分值: 150
验证便失效的验证码
这次变高级了一点,验证一次过后就会失效,但是可以在失效后把包里的验证码删掉再发包,服务端就不再验证验证码的内容了
所以这道题目的关键就是使用burp抓包,然后将vcode内容置空,然后爆破
Q7:
逗比的验证码第三期(SESSION)
分值: 150
尼玛,验证码怎么可以这样逗比。。
验证码做成这样,你家里人知道吗?
这题的关键就是加入了session验证,把cookies的内容删掉就好
Cookie: PHPSESSID=
或者和Q6一样
vcode=
补充一点验证码的小知识,引用自watch0ut的博客(翻墙可访问)
验证码发布的流程
1. 显示表单
2. 显示验证码(调用生成验证码的程序),将验证码加密后放进 session 或者 cookie
3. 用户提交表单
4. 核对验证码无误、数据合法后写入数据库完成
用户如果再发布一条,正常情况下,会再次访问表单页面,验证码图片被动更新, session 和 cookie 也就跟着变了
但是灌水机操作不一定非要使用表单页面,它可以直接模拟 post 向服务端程序发送数据,这样验证码程序没有被调用,当然 session 和 cookie 存储的加密验证码就是上次的值,也就没有更新,这样以后无限次的通过post直接发送的数据,而不考虑验证码,验证码形同虚设!
所以,在核对验证码后先将 session 和 cookie 的值清空,然后做数据合法性判断,然后入库!这样,一个漏洞就被补上了!
简单说及时cookie和vcode相互验证,所以删掉一个即可,然后爆破即可
Q8:
微笑一下就能过关了
分值: 150
尼玛,碰到这样的题我能笑得出来嘛...
个人认为这道题目的分数设置偏低了,对于一个php渣(本人)来说,这道题考察就是“php函数理解+php函数冷门特性+人品”
首先点进去之后发现,里面源代码
这3个字是可以点击的,然后会直接跳转到index.php?view-source
页面,里面显示的是包含php源码的页面源码
<?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);
}
?>
然后表单的源码是这样的,input框的name是T_T
,然后希望我们GET方式提交的变量名是^_^
,所以,在这个输入框输入什么都是没有结果的
所以咱们需要另辟蹊径,在url处自己提交^_^
变量,达到GET方式提交的效果
那么简单说一下这一串php的大致意思
前面是显示一下php源码
然后包含一下flag.php,我们想要的东西都在这里
定义了一个变量smile为1
底下是一大段正则,如果^_^变量不存在,或者包含
. % 数字 http https ftp telnet
则将smile变量置0
如果$_SERVER['QUERY_STRING'](查询字符串,直接引用url中
?后面的部分,比如http://www.a.com/index.php?id=1,那么$_SERVER['QUERY_STRING']就是id=1)
查询字符串中包含下划线_,那么smile置零(此处不继续用^_^其实有原因,后面会说)
好,然后如果满足上面要求的^_^变量存在,那么smile变量置0(这个逻辑简直醉人啊,存在也置零,其实这里存在考察点)
终于到最后了,如果变量^_^中的内容为(●'?'●),那么die()函数输出flag变量,并退出当前脚本
整理一下,简而言之,我们要
1.构造一个GET型^_^变量,其中不能有“. % 数字 http https ftp telnet”
2.查询字符串里不能有下划线_
3.^_^变量不能存在
4.^_^变量的内容为(●'?'●)
矛盾啊
第2条,我们提交的查询字符串肯定包含^_^,所以肯定有下划线啊
第3,4条,变量都不存在,然后怎么读数据???
通过查询大量资料,我们发现php其实存在一些非常冷门的特性,这些特性都导致过一些漏洞
关于第2条,不能有下划线,其实php的url中,当.或者[ ]之类的符号作为参数的键key时,会被php自动转换成下划线_,所以,使用
“^.^或者^[^再或者^]^”,就会被php当成^_^
而$_SERVER['QUERY_STRING']取的是原先的内容,并不会做转换,也就是说如果以^.^做参数的key,$_SERVER['QUERY_STRING']取的是本身^.^而php取的就是^_^,看来还是处理方式的差异导致绕过
第3,4条嘛使用file_get_contents可以获得远程的数据,但是过滤了http等协议,但是该函数支持data协议,data协议有个特点就是file_exists()函数认为data协议指向的内容不存在,所以胜利在望啊
data协议的格式非常简单(IE6不支持)
data:资源类型;编码,内容
要生成一个html资源,可以这样:
data:text/html;ascii,<html><title>hello<title><body>world</body></html>
我们构造明文就行
data://text/plain;charset=unicode,(●'?'●)
所以最后我们构造的url是
http://lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php?^.^=data://text/plain;charset=unicode,(●'?'●)
1.php认为^.^是^_^,且^_^中不包含“. % 数字 http https ftp telnet”
2.$_SERVER['QUERY_STRING']取^.^=data://text/plain;charset=unicode,(●'?'●),不作下划线转换,所以没有下划线
3.file_exists函数认为data协议指向空所以不存在
4.file_get_contents取^_^中的data://text/plain;charset=unicode,(●'?'●),认为内容就是(●'?'●)
完美绕过!关键点就是利用函数之间对同一参数处理方式的差异
访问即可拿key
Q9:
逗比的手机验证码
分值: 150
你的手机号码是13388886666,验证码将会以弹窗的形式给出
这道题相对于上一道题目,难度降低了很多,首先点开链接,点击获取验证码,然后验证码以弹窗的形式给出,输入验证码之后,又会提示,请以
13388886667登陆
以13388886666的手机号拿到验证码之后,提交请求,然后使用burp抓包,再将号码改成13388886667,提交即可
Q10:
基情燃烧的岁月
分值: 150
Tips:你是一名黑客,你怀疑你的“(男/女)闺蜜”的出轨了,你要登陆TA手机的网上营业厅查看详单,一探究竟! 闺蜜手机号码:13388886666
首先吐槽一下,闺蜜出轨了和我有啥关系?真是基情燃烧啊
点击获取手机验证码以后,弹出“手机验证码是:验证码发到手机上了,你看不到..是3位纯数字,开头不为0”,嗯,这样的话拿burp从100到999之间爆破一下就行了。ok,验证码是165,提示
你伤心的发现他/她正在跟你的前男/女友勾搭.....于是下决心看看前任除了跟你的(男/女)闺蜜勾搭,是不是还跟别的勾搭..
前任的手机号码是:13399999999
原来是勾搭前任啊。。。然而还是关系不大吧,话说闺蜜和前任真是土豪,手机号都是豹子号,难怪能在一起
Ok,回到刚刚的界面把号码改成前任的,继续爆破验证码然后就可以拿key了
Q11:
验证码识别
分值: 350
验证码识别
Tips:验证码依然是3位数
点进去之后发现添加了验证码啊,这个就很忧桑了,不过也有两个方式可以解决
方法一:python+tesseract可以识别验证码
源码引用自http://blog.csdn.net/gwenchill/article/details/46679621
也是一个很好的writeup呢,注意改一下cookie即可
方法二:使用PKAV推出的神器http fuzzer
这个真心好用,相关地址见http://www.freebuf.com/sectool/61313.html
流程就是
1.变体设置选项卡粘贴发包请求,标记爆破的部分+验证码部分,爆破部分选择相应字典和规则
2.图片型验证码识别,通过审查元素,查看一下验证码的url,识别范围设为0-9,可以测试一下
3.重放选项,选择单线程模式(必须)。长度固定4位
4.发包器启动即可,根据长度可筛选出含key的包
顺便一提:HackingLab所有爆破验证码的题目,最后的结果一般都在400次以内,比如3位验证码,不会超过400,4位验证码不会超过1400,如果爆破超过500次还没出结果,建议你看一下爆破的响应结果,看看是自己提交的包有问题还是网站崩溃了
Q12:
XSS基础关
分值: 50
XSS基础:很容易就可以过关.XSS类题目必须在平台登录才能进行.登录地址请参考左侧<子系统>
有些人点进去之后发现提示要登陆,然后自己明明登陆了呀,为什么呢?题目都提示要点击左侧导航栏--子系统--题目平台登陆
再提示一下,有些浏览器自带xss过滤功能,所以长时间搞不定可以自己换一个浏览器,比如firefox就可以
登陆之后我们就可以进行答题了,页面很简单啊,突破口在哪里呢?
我们看一下页面源码,发现有一个xss_check.php的script,然后查看一下它的源码
orgAlert = window.alert;
ok = 0;
var HackingLab="success!";
function newAlert(a) {
window.alert = orgAlert;
if (a == HackingLab) {
if (ok == 0) ok = 1;
alert(a);
$.post("./getkey.php?ok=1",{'url':location.href,'ok':ok},function(data){
console.log(data);
});
showkey();
} else {
alert(a);
alert("Please use alert(HackingLab)!!");
}
}
window.alert = newAlert;
function showkey(){
//XSS题目要自觉.....无论如何都是可以绕过的,索性不加密不编码js了,大家一起玩吧.
var url="./getkey.php";
$.post(url,{"getkey":"岁月如歌"},function(data){
$("#msg").text(data);
});
}
讲道理,逻辑很简单:能alert(HackingLab)就能拿key。当然下面也说了可以绕过,以下4道xss题其实都可以绕过,Q15会说,然而咱们现在还是老实一点吧
既然没有过滤那么提交
<script>alert(HackingLab)</script>
就ok,如果系统提示:先别黑了,做题吧...
那就再提交1次就好
Q13:
XSS基础2:简单绕过
分值: 100
很容易就可以过关.
如法炮制提交
<script>alert(HackingLab)</script>
显示XSS_SCRIPT_DETECTED!!!,有过滤啊
这个时候就是各种绕过技巧各显神通的时候啦,可以拿burp提交所有的payload,最终效果是alert(HackingLab),只要返回结果不包含XSS_SCRIPT_DETECTED!!!,就很有可能成功了,拿着这个payload去手工测试就行
此处可用
<img src="#" onerror=alert(HackingLab) />
Q14:
XSS基础3:检测与构造
分值: 130
XSS基础3:检测与构造
Tips:不是很难
Ok,上一题的payload不出意外又失效啦
发现welcome多了一个input框,在上面的input框提交任意字符串发现都会显示到下面的input的框,测试了一下
吃掉了<
过滤了javascript:
未过滤>,/,常规字符串,’(单引号看起来像吃掉,其实源码里存在)
所以我们构造的payload不能有<
可以利用'去闭合input框value的单引号
最后的payload是
alert(hahaha)' onclick=alert(HackingLab)>
然后单击一下welcome旁边的input框就可以了,最后页面的源码是
Welcome <input type='text' value='alert(hahaha)' onclick=alert(HackingLab)>'>
所以做这种题目一般是不知道网站的过滤规则的,相当于面对的是一个黑盒模型,所以应该测试一下常见的xss payload来分析到底过滤了什么字符,然后构造合适的payload
Q15:
Principle很重要的XSS
分值: 300
原理/原则/理念很重要.....不是所有的xss都叫特仑苏.. ^_^
Take it easy!
关于xss题目的绕过技巧...其实非常简单
方法一:打开console,输入alert(HackingLab),然后直接运行就可以了
方法二:根据xssjs/xss_check.php 所说,来到
http://lab1.xseclab.com/realxss4_9bc1559999a87a9e0968ad1d546dfe33/getkey.php
使用hackbar等工具,post方式提交
getkey=你的HackingLab用户名
然后马上就显示key
还不快抢沙发