攻防世界web

版权声明:本文为博主原创文章,未经博主允许不得转载。如有问题,欢迎指正。 https://blog.csdn.net/qq_26406447/article/details/90487652

攻防世界web

前言

准备ctf比赛,这里把攻防世界分值低于5分的基本刷了一遍(分值再高刷不动了…)

练习

  1. view_source
    1
    没难度知识禁用了右键点击,ctrl+u查看源码拿到flag

  2. get_post

    这题没什么好说的,按着提示来就能拿flag
    2
    但我发现下面的hackbar不能用后用burp来进行post传参不返回flag…迷了我很久…

    结果我下了左边那个hackbar后重来一遍,结果就返回flag了,很迷,我burp肯定没用错啊…

  3. robots

    这道题也没什么好说的啊,考一个robots协议的理解(就是在玩爬虫时我们从来没有理会的一个协议…),这里查看robots协议,看到flag的php访问拿到flag
    3

  4. backup

    这道题还是有点意思,考查一个备份文件,因为前面刚看了源码泄露方面的东西,结果这里一来就直接想到了vim的文件备份结果试~,没有…这时候一看人家也没提示说vim,正常的备份一般是加,.bak(比较常见的方法,当然手动备份也可以自己来取名,但程序员我感觉还是会偏向于统一)然后访问就可以下载到备份文件,查看文件拿到flag
    4
    参考:备份文件:被低估的Web威胁

  5. cookie

    这道题也没什么说的,访问网页检查元素查看cookie,看到cookie.php,然后直接访问

    看到提示说查看response,响应头就藏着flag

    5

  6. disabled button

    这道题也没什么意思,有个按钮,查看源码可以发现是个input输入框,那直接post发送数据过去就得到flag了
    6

  7. simple js

    从题目就可以看出是一道javascript题

    访问页面,查看源码,可以看到js代码
    7
    分析得到下面的16进制的字符就是flag内容…(js确实有待学习加强,这里看了好久…)

  8. xff referer

    这道题也是比较初级的

    我是用两个插件解决的

    第一个它要求ip是123.123.123.123,我用的是X-Forwarded-For Header,

    第二个要求是来自 www.google.com 这个用hackbar添加的Referer

    当然直接抓包添加

    X-Forwarded-For: 123.123.123.123
    Referer: www.google.com

    这两个参数也行
    8

  9. weak auth

    这道题是个弱密码题,随便尝试登录,会告诉你用admin来登录

    然后查看源码会提示你需要一个字典,这就很容易想到暴力破解了吧

    这里用burp来尝试暴力破解
    9
    可以看到密码是123456的时候返回长度与别的都不一样,尝试用admin,123456来登录,登录成功获得flag

  10. webshell

    这道题考查菜刀的使用,用过的话就没什么难度

    题目描述中提示了一句话木马是index.php,访问网页看到一句话是<?php @eval($_POST[‘shell’]);?> ,得到’密码‘是shell,菜刀连接,文件管理就可以看到flag了
    10

  11. command execution

    刷过dvwa应该都知道这个漏洞,这也和dvwa的low级别没什么差别

    这里先127.0.0.1 & find / -name “flag.*” 来查找flag文件的位置(找不到的话可以试下找flag文件)

    然后看下图可以发现找到了
    11

    然后cat 文件得到flag

  12. simple php

    代码审计,这个代码还是比较简单易懂的
    12
    这里看代码就能明白,这里考的是php的==和===

    eg : $a = ‘123’; $b = 123;

    ​ $a === $b为假; $a == $b为真;

  13. ics-06

    这道题拿到的时候也没有什么好的思路,主页面点击没什么反应,查看代码后发现点击报表中心会跳转到index.php。跳转后可以看到Get传了一个id值,我这里以为是sql注入,结果没注出来。后面发现,这里是要暴力破解,id等于2333的时候出结果2333
    13

  14. Training-Get_Resourced

    这道题直接在描述里提示了看注释就是看页面源码,进入页面也有一行比较淡的字提示看源码,打开源码就能直接得到flag,没什么意思…
    14

  15. Training-WWW-Robots

    还是考查robots协议啊,访问robots.txt那里不让访问就去访问那里,就得到flag
    15

  16. NaNNaNNaNNaN-Batman

    这道题对我还是挺难的,因为不怎么会(不会)js…

    题目是给了个附件,以为是代码审计,也确实是代码审计,不过里面是乱码,但不全是乱码,能看出<script>,<eval>这些标签,很显然是个html文件,大概也能看出,前面是个函数,然后eval去执行,这里是把eval改为alert弹出非乱码形式的源码
    16
    分析其实可以直接运行里面的代码拿到flag,而不用去构造前面的匹配
    17
    然后可以看到直接出flag了

  17. NewsCenter

    这道题进去的时候也是比较懵,但看了下源码也就search那里可以操作,这种搜索框很容易想到sql注入,输入1查询正常,输入1’查询崩溃。OK存在注入,然后按照注入步骤来,整体很简单,dvwa low级别的难度吧手工很好注出来,sqlmap也能很好注出来
    18

  18. lottery

    这道题有点难了…(菜鸡的无助)

    这道题很显然是让我们去输入7个数字然后与答案匹配获得金币,然后购买flag

    抓包,发现cookie有提示说看cookie.php,但并不能访问

    然后我想能不能改个PHPSESSID来改换账户购买,但md5试了下破解不了,而且我们也不知道有别的账号
    19
    陷入僵局…

    然后我看了下别人的提示说看下robots.txt

    OK看到里面的提示就很熟悉了,最近刚好看了源码泄露的一些资料,还正好想试下GitHack这个工具…
    20
    使用githack工具
    21
    我们成功下回了源码,通过burp前面的代理我们可以看历史,发现我们buy的时候会访问api.php

    这时候就是代码审计了
    22
    可以看到buy的代码片段,这里又考查的是==这个知识点

    抓包可以看到是惊悚格式数据,然后$number也没有检查数据类型
    23
    OK,像上面那样改包就能成功赢的金币,然后就能购买flag了

  19. upload

    这道题我也很无语,很简单的文件上传漏洞用burp抓包或者禁js都能上传成功,上传的phpinfo也能访问成功,但我一句话就是连不上…我看别人的博客都是一句话能连上,很无语,最后上传了一个大马直接访问猜拿到flag…现在还是没懂为什么一句话没连上…
    24

  20. mfw

    这道题还是挺绕的

    首先是查看源码,看到注释里面有?page=flag
    25
    结果并没有返回

    然后再翻看网页,看到提示说他用到了git想到源码泄露,githack用起来
    26
    很开心看到下载到了flag.php,结果打开是空的,真的只是模板

    里面有用的就是index.php了,这时候就变成代码审计了
    27
    这里有个assert函数,这个一句话中也有用这个函数的

    如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。跟eval()类似, 不过eval( a s s e r t i o n ) p h p assertion)只是执行符合php编码规范的 code_str。

    所以我们要利用这一点来执行我们的命令

    这里我感觉和注入是差不多的,因为没有过滤,所以我们可以注入些我们想要执行的东西

    assert(“strpos(’$file’, ‘…’) === false”) or die(“Detected hacking attempt!”);

    有两句assert,我们拿上一句来进行注入,首先我们随便构造一个文件名来闭合strpos,x’),然后

    我们有or来拼接我们要执行的语句,因为前面随便构造的文件所以会为false,我们后面的命会执行,or system("cat templates/flag.php "); //并注释掉后面的

    page=x’) or system(“cat templates/flag.php”);//

    这里自己php水平太菜所以看得别然人的,我总感觉上面assert没有闭合呢…但问题是上面的语句能正常运行,我想的反而不太对…php不愧是世界上最好的语言好难懂

    assert("strpos(’$filex’) or system(“cat templates/flag.php”);// 怎么看都不像闭合了呢

    然后查看源码就能看到flag了
    28
    这题考查的就相对绕了一些不像前面的题只考一个知识点那样了。

  21. FlatScience

    这个有点难了对于我这样的菜鸡来说

    首先登陆网站后发现有很多pdf就没什么收获了

    这时候查看robots.txt(主要看有没有提示什么后台登陆吧,现实中在robots里添加后台登陆也是比较常见的)或者用网站路径扫描器来扫描也是没问题的
    29
    这时候登login.php可以看到是个登陆界面,admin.php也是一个登陆界面

    看源码可以看到login.php中有提示
    30
    按照提示我们加?debug去访问,然后发现有源码,进入代码审计
    31
    可以看到有数据库查询语句,很明显存在注入(因为没有过滤),但这里的难点在于用的是sqlite这个数据库,虽说sql注入原理都一样,但实现细节还是不一样的…

    注入手法一样,先order by看字段数,这里注释符号用 –

    3的时候报错所以有两个字段
    32
    源码分析可以看到setcookie,这还是一个比较简单的sql注入,有返回值

    usr=’ union select name,sql from sqlite_master–
    33
    可以看到有user表,我们关心的name,password和hint(因为代码审计可以看到密码存储sha1的方式,所以肯定还需要提示来破解)

    ’ union select group_concat(name),group_concat(name) from Users –
    34
    ’ union select group_concat(password),group_concat(password) from Users –
    35
    ’ union select group_concat(hint),group_concat(hint) from Users –
    36
    这里我是看到最后的hansi用户它的提示是password is password然后尝试登陆,不行登不上…

    其次有用的提示就是admin了,他最喜欢的paper中最喜欢的词…这个就很像啊,因为前面给了那么多的pdf…

    我看了下后面的思路,主要是先爬取下来所有的pdf,写py脚本将pdf转为文本文件(主要用到pdfminer模块),然后再每篇文章一个词一个词的提取出来进行sha1计算(按照代码中的加盐),和我们sql注入出来的sha值比较一样的就停止得到密码

    然后再admin.php界面登录得到flag

    这里贴一下别人的py代码吧

    from cStringIO import StringIO
    from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
    from pdfminer.converter import TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfpage import PDFPage
    import sys
    import string
    import os
    import hashlib
     
    def get_pdf():
    	return [i for i in os.listdir("./") if i.endswith("pdf")]
     
     
    def convert_pdf_2_text(path):
        rsrcmgr = PDFResourceManager()
        retstr = StringIO()
        device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=LAParams())
        interpreter = PDFPageInterpreter(rsrcmgr, device)
        with open(path, 'rb') as fp:
            for page in PDFPage.get_pages(fp, set()):
                interpreter.process_page(page)
            text = retstr.getvalue()
        device.close()
        retstr.close()
        return text
     
     
    def find_password():
    	pdf_path = get_pdf()
    	for i in pdf_path:
    		print "Searching word in " + i
    		pdf_text = convert_pdf_2_text(i).split(" ")
    		for word in pdf_text:
    			sha1_password = hashlib.sha1(word+"Salz!").hexdigest()
    			if sha1_password == '3fab54a50e770d830c0416df817567662a9dc85c':
    				print "Find the password :" + word
    				exit()
     
    if __name__ == "__main__":
    	find_password()
    
  22. upload

    使用了我所知的一切方法进行上传,burp,文件截断…但完全不行,后台对文件进行校验,也没文件包含漏洞,卡主,毫无头绪…

    后面看writeup说这是一道注入题…

    这是一道insert注入题,insert注入听过,但没练习过…但原理我觉得就是插入数据的时候有些值插入成database()这种,后面显示的时候就会显示出数据库名。这里我们上传文件后会显示下图的信息
    37
    后面会重定向到初始页面显示上传过的文件名

    这里有了查询操作所以存在了二次注入的可能

    这里的注入也特别麻烦,有很多过滤规则…

    参考

    2015年rctf web150 (Update set 二次注入)

    RCTF2015+XCTF复现之一次上传的图片的文件名造成注入

    但注入出来的结果我提交为什么不对了…(好吧不要按它说的格式来,直接交才正确…)

  23. php2

    页面就没什么信息,先查看robots.txt没有,再查看常用的几个界面,admin.php,login.php,index.php都没有…

    路径扫描吧,扫出来会发现有index.phps(我是没扫出来,看了别人的字典添加后扫出来…)

    访问,可以看到有部分代码片段,查看源码,能看到详细代码,变为代码审计
    38
    这里就是要我们构造一个合适的id就能得到flag,可以看到需要的id进行urldecode后要等于admin,这就是二次编码,因为服务器接受到数据后会进行一次url解码,然后代码又解一次

    二次编码,可以自行百度下,我看别人都是用御剑来做的,这里admin比较短查表也方便吧

猜你喜欢

转载自blog.csdn.net/qq_26406447/article/details/90487652