为期一个月的hgame寒假训练赛终于结束了。每周都在做题,讲真这么用功学习还真是很少见。当然,一个月时间自己也学到了很多(虽然还是咸鱼),这里感谢学长们花了很长时间出题目,也感谢几位学长耐心给我解答=。=这篇文章是对寒假学习知识的梳理,也仅代表本咸鱼的观点,如有错误请指出。另外,这边文章也以我在假期写的四篇wp作为参考,链接如下:
https://github.com/zer0e/writeup2018
基础总结
代码审计
代码审计通常不会单独成题目,而是结合web漏洞来成题,例如:
你首先需要审计代码才能知道该如何绕过限制(当然这段代码有点短),先是知道pattern是什么,然后了解json怎么绕过。所以说代码审计在比赛中绝对是基础中的基础,对此你需要了解相应的语言。
请求头的查看与修改
请求头在web中是最常见的东西,相应的请求头中的信息我们更需要加以利用。例如:
通过修改请求头来达到我们的目的。至于如何修改,之后说。
工具使用
工具的使用那就很多了。常见的web工具有burpsuite(一款强大的网络工具),sqlmap(sql漏洞检查工具)等等,具体可以网上找找相应的ctf工具合集。这里我们可以用burpsuite来进行抓包改包重发包。
类似的工具还有很多,需要自己慢慢去摸索。
脚本书写
脚本的书写通常是在工具已经无法满足我们要求时,我们需要自己书写脚本来实现某种特定的要求。这里我推荐的脚本语言为python,毕竟人生苦短,我用python。=。=假期的时候自己也写过一些脚本。这里就不贴出来了。
综上,想打ctf,基础知识和工具使用一定必不可少。下面讲讲新手会碰到的常见漏洞。
常见漏洞梳理
LFI
PHP当中有许多的常见的漏洞,其中最常见的就是文件包含漏洞。在假期的学习中,遇见的两题常见的文件包含漏洞。
1.直接通过修改文件路径来获得文件内容。
我们发现url后带有文件路径,随即修改路径为flag.php查看response即可拿到flag。
2.通过php伪协议来读取文件。那么什么是php伪协议?php中支持的伪协议有以下几种:
1 | file:// — 访问本地文件系统 |
这里我们重点要说的就是php://
先给出官方文档
http://php.net/manual/zh/wrappers.php.php
之后我会写一篇详细的文章讲讲我对php://伪协议的理解,这里便不再多讲。
回到题目,有时候我们无法通过直接输入文件名来获取文件,便需要使用php伪协议来把文件的base64编码后的内容读出,从而获得flag。
1 | //我们常用的php任意文件读取payload |
这里使用的过滤器为convert.base64-encode,字面上就可以知道是把读取的内容encode成base64编码。过滤器的问题,我一起留到后面的文章。
以上就是常见的两种LFI漏洞的利用。
xss
xss,全程为Cross Site Scripting,也称跨站脚本攻击。攻击者通过在web页面中插入恶意的script代码,当有用户访问这个页面时,该用户就会受到攻击。xss分为存储型和反射型。反射型xss,是非持久的,只有用户自己点击链接才会触发。而存储型xss,是攻击者插入到服务器的恶意代码,例如博客文章等地方。这种xss通常比较危险。
要理解xss,就必须理解html语言。
例如:
出题者已经给出了关键代码。那么我们怎么去插入一段代码让网页弹窗出现数字1呢?
我们知道代码过滤了script,image还有左括号,由于img标签没有被过滤,我们就可以通过img标签的onerror来执行恶意代码。构造:
1 | <img src='' onerror=alert(1)> |
如此,便完成一次了xss攻击,事实上,攻击者通常将alert(1)换成其他恶意的代码来进行攻击,例如盗取cookie等等。
sqli
sqli,通常意义上指数据库注入。攻击者通过对参数的修改来达到访问数据库的目的。
例如有以下的php语句:
1 | $user = $_GET['user']; |
由于没有任何过滤,攻击者可以通过修改user的值来对数据库进行访问。例如攻击者使username=’ and 1=1
那么后台的sql查询语句就变为:
1 | select * from users where username='' and 1=1; |
由于1=1为永真式,那么这条语句就会列出user表中的所有数据。这必定造成极大的危害。
sql注入通常有两类,有回显的注入和无回显的注入。有回显的注入又分为带有数据的回显型注入,基于布尔的注入,还有基于报错的注入等等。无回显的注入,一般有基于时间延迟的注入。
一般新手使用的是sql注入自动化工具——sqlmap,一个可以自动判断类型和自动注入的python脚本。但我还是希望每位初学者可以少用或者不用这些脚本,如果连原理都不明白,那也只是单纯的一个脚本小子而已。当你明白原理,知道怎么做之后,那用用别人的脚本确实是没什么的。
这些注入整理我也会在以后的学习和比赛中慢慢积累和学习,这里便不在多讲。
下面以一道例题结束这篇文章。
我们发现一个网站存在注入,并且后端已经有单引号了。
所以我们就可以进行爆库,也称脱库。
这里先爆数据库的名称。一般来说sql注入题最后都有一个闭合符合#,但这题自动帮你加上了。(毕竟是新手题)
然后就是一爆到底了。
1 | //爆表名 |
这就是sql的新手入门题了。
这篇文章讲的不是很多,但算是我假期间对web知识的再学习和补充。下次我将讲讲我对ctf中misc杂项的入门总结。