WEB安全基础知识及综述
ξ1-Web安全综述
WEB系统架构
新的安全问题
SQL注入
存储型XSS
文件上传
……
OWASP TOP10
注入
失效的身份认证和会话管理
XML外部实体(XXE)
失效的访问控制
安全配置错误
跨站脚本(XSS)
不安全的反序列化
使用含有已知漏洞的组件
不足的日志记录和监控
ξ2-Web安全基础知识
HTTP协议(超文本传输协议)
HTTP特点
HTTP协议建立在TCP协议基础之上
HTTP协议是无状态的
URL
统一资源定位符,从协议开始,可以唯一确定资源地址的字符串
URI
统一资源标识符,在一定约束条件下可以唯一确定资源地址的字符串(URL中除去域名和端口部分)
HTTP方法
GET:获取资源
获取请求页面的指定消息
请求参数在请求头中
请求长度有限制
eg:GET /index.php?id=1 HTTP/1.1
POST:传输实体主体
获取请求页面的指定消息
请求参数在请求正文
eg:POST /index.php HTTP/1.1
HEAD:返回报文首部
OPTIONS:询问支持的方法
PU ...
使用Hexo+GitHub搭建自己的个人博客
由于自己之前在GitHub白女票的服务器到期了(再用下去就要自己掏腰包了,学生党受不起o(╥﹏╥)o),所以今天在此将自己的博客移植到永久免费的GitHub中,作为GitHub Pages来继续完成它的使命~(这也算是给自己填坑吧)
基础的hexo安装与美化这里就不再赘述,可以翻看我之前的文章:
使用Hexo+Nginx+Namecheap+DigitalOcean搭建个人博客网站
Hexo进阶——主题和功能的完善
下面就开始进入正片~~
创建GitHub仓库
首先咱们需要创建一个GitHub仓库,当然没有GitHub账号需要先注册
注册完之后点页面右上角创建新的GitHub仓库
输入自己项目仓库的名字,我这里是baymrx(注意这里必须使用GitHub的用户名,否则不能成功),记得后面一定要加.github.io后缀,仓库类型设置为共有仓库,下面的REDEME初始化也要勾选
配置GitHub Pages
信息填写完成后点击创建,创建完成后进入自己的仓库页面,点击Settings,往下拉到底可以看到GitHub Pages模块,这里可以选择博客的默认主题(当然没啥用),如果已经申请 ...
PWN刷题记录——guess_num
guess_num:[下载地址]
题目分析
拿到题目先跑一下康一康
是一个猜数的游戏,随便输几次数跑一下,不料第二回合就GG了
丢到IDA里打探一下
通过分析源代码发现程序会随机产生10个随机数分布在10个回合中,只要每个回合的数字都猜对就可以进入子函数直接获取flag
对程序进行安全机制检查发现,程序所有保护都开启了,咋办?有点慌、、
由于有了堆栈保护,所以程序不能通过栈溢出返回到sub_C3E()函数,这条路子就、、死心吧,只能另寻他路
既然不能控制程序返回地址,那么我们考虑一下是不是可以控制一下栈上的数据,比如控制用来产生随机数种子得到srand函数。我们知道,srand函数所产生的随机种子是由seed的值确定的,seed一样,rand函数产生的伪随机数值也会一样。
先看一下程序中的seed是怎么来的
看样子是没法直接得知seed的具体值,那么就只能直接开干了
在IDA里面查看main函数的栈空间可以得知
程序中的变量v7即栈空间中的var_30,它在栈中到变量seed的偏移量为0x20
利用思路
由于程序中gets函数没有对输入大小进行限制,所以我们可以利用ge ...
PWN刷题记录——2016 AliCTF-vss
2016 AliCTF : vss [下载地址]
题目分析
首先检查一下程序保护
只开启了NX保护,而且程序是64位的
运行一下
发现需要密码……直接丢到IDA里面查看,加载用了一段时间,程序有一丢丢大
打开之后也直接懵逼了,程序不像是我们之前所见到的那样,而是包含了大量的函数,猜测文件可能是静态编译,把所有用到的库函数都放在了一个文件里面进行编译
在linux里面用file检查,果然是静态链接
在IDA里面有一个start函数,猜测是程序开始的地方,但是一阵乱点之后也没找到程序执行的内容在哪,想起IDA可以通过字符串查询,Ctrl+T搜索Password:
终于找到了程序真正开始的地方,可以对一些函数功能进行猜测然后对其命名,方便后边的分析查看。根据程序的流程可以猜测sub_408800是puts函数,sub_437EA0是read函数,在这里最大可以读取1024字节的数据,数据被读入到v1中,可以将其命名为str。str的缓冲区有400h=1024个字节,所以这里并不会产生溢出漏洞
我们进入到sub_40108E继续查看
看到sub_400330函数的形式比较熟悉 ...
PWN刷题记录——Defcon 2015 Qualifier: R0pbaby
题目来源CTF-Wiki练习题,下载链接:R0pbaby
题目分解
先来检查一下程序保护
64位程序,开启了堆栈不可执行,地址随机化还有一个我们先前没有见过的FORTIFY,谷歌简单查了一下知道它用于检查是否存在缓冲区溢出错误,但只是很轻微的检查,所以我们忽略不计。
先来运行一下看一下它的面貌
程序具有四个选项,其中前两个选项可以输出libc的地址和libc中某一函数的地址,第三个选项可以把数据拷贝到栈上而且给出了我们所能输入的最大值1024,由此盲猜选项三应该存在栈溢出,丢到IDA里面看一看
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111__int64 __fastcall ma ...
PWN刷题记录——2013-PlaidCTF-ropasaurusrex
题目来源于CTF-Wiki练习,下载链接:程序 | libc
拿到题目先检查程序保护
扔到IDA里面查看,程序在主函数里面调用了一个子函数,双击进入子函数可以看到我们熟悉的read溢出漏洞
先来找一下溢出的需要的偏移量,随机生成200个有序的字符
1cyclic 200
将生成的字符串复制,使用gdb对程序进行运行调试,在程序等待输入的时候,把生成的随机字符串输入进去
然后可以得到程序溢出报错的地址0x6261616b,再次使用cyclic可以得到程序溢出所需要的偏移量为140
根据题目名称和所给的libc盲猜是ret2libc的题目
大体思路如下:
首先根据程序源码的结构,我们要利用write函数将程序已经执行过的函数(比如read)地址泄露出来,然后再控制程序返回到含有溢出漏洞的函数,以便下一步溢出到system
根据泄露的函数的真实地址计算得到在libc中的基地址
利用基地址在libc中找到system和/bin/sh的地址,最后在payload中拼接打入程序即可
下面就可以编写我们的exp的,在写之前,我们还需要找一下程序中溢出函数的地址
打开IDA,在mai ...
PWN刷题记录——train.cs.nctu.edu.tw: rop
今天来做一下train.cs.nctu.edu.tw: rop,题目来自于CTF-Wiki的练习题,是bamboofox的入门练习题,题目地址
题目分析
打开题目发现没有任何文件可供下载查看,只有一个远程连接的地址,这根我们之前做的PWN题目都不太一样,莫得办法,nc连上先看看吧
1nc bamboofox.cs.nctu.edu.tw 10001
连接上之后,屏幕里刷刷刷出来一大片(要刷屏的节奏??!!)
再仔细一看题目要求,这是给了我们14个gadgets,然后让我们按照一定的顺序排列,使得这些gadgets能够组合成一段可以完整执行的程序从而获得shell或者flag
对于我这样一个小萌新来说,看到这个题目真的是一筹莫展,第0段gadget提供了int 80h功能调用,由此自然而然地想到了使用系统调用execve("/bin/sh",0,0)来获得shell,下面就要进行拼凑辣。
大概思路
先找一下大概的拼凑思路:
要调用execve(),我们需要查一下系统调用表
根据系统调用表我们可以看到,execve()的系统调用号为11,即0xb,储存在 ...
栈溢出漏洞利用技术学习笔记
听i春秋上面蓝莲花战队成员Atum的课程 CTF PWN选手的养成 ,了解到不少东西,在此记个笔记~
基础知识
栈的结构:先进后出,在内存中为高地址往低地址增长,栈顶为栈的最上方(低地址区),栈底为栈的最下方(高地址区)
一、寄存器
rsp/esp:指向栈顶的栈指针寄存器(低地址)
rbp/ebp:指向栈底的指针寄存器(高地址)。栈低通常作为基址,我们可以通过栈底地址和偏移相加减来获取变量地址
栈的结构如图所示(栈由高地址向低地址增长)
函数调用时栈的变化
EBP指向的栈底,ESP指向的栈顶,EBP下面的EIP是函数返回的地址(即return执行后下一条指令的地址),var1是函数的参数.
pc:程序指针,存储着指向CPU接下来要执行的指令地址
rdi rsi rdx rcx:x86中参数都是保存在栈上,但在x64中的前六个参数依次保存在RDI, RSI, RDX, RCX, R8和 R9中,如果还有更多的参数的话才会保存在栈上。
二、栈溢出漏洞介绍
通俗的讲,栈溢出的原理就是不顾堆栈中分配的局部数据块大小,向该数据快写入了过多的数据,导致数据越界,结果覆 ...
Pwn学习记录——基本ROP-2
题目来源 CTF Wiki
ret2libc
ret2libc 即控制函数的执行 libc 中的函数,通常是返回至某个函数的 plt 处或者函数的具体位置 (即函数对应的 got 表项的内容)。一般情况下,我们会选择执行 system(“/bin/sh”),故而此时我们需要知道 system 函数的地址。
关于got和plt的介绍:介绍got plt以及libc.so
ret2libc1
题目下载
首先检查程序的安全保护
程序只开启了栈不可执行保护,下面丢到IDA里面看一下程序源代码
可以看到在执行 gets 函数的时候出现了栈溢出,Alt+T搜索发现跟ret2text一样具有system函数,但是不再是可以直接执行的system(”/bin/sh“)了
要使用system函数,需要将程序跳转到plt处,找到地址为0x08048460
所以需要我们手动将参数 /bin/sh传入进去,使用ROPgadget搜索
1ROPgadget --binary ret2libc1 --string '/bin/sh'
正好存在,那么我们就可以控制程序直接返回到sys ...
Pwn学习记录——基本ROP-1
题目来源 CTF Wiki
ret2text
题目下载
首先,拿到题目我们先查一下保护
可以看到,程序是32位的,只开启了NX保护
下面我们拖到IDA里面看一下
很明显的gets函数溢出漏洞,先来搜索一下程序里面有没有可以直接利用的溢出漏洞,Alt+T搜索system关键字
可以看到,在secure()函数里面发现了可以直接调用system("/bin/sh")的代码,如果我们控制程序返回到这段代码的位置,那么就可以直接得到shell
首先我们在gdb中调试算出程序溢出需要的偏移量
找到get函数的地址,在peda中设置断点(这里若不显示地址,可以右键Text View查看)
使用 r 命令让程序跑起来,可以看到此时寄存器的内容
我们计算偏移量使用EBP和ESP的地址,字符串s的地址是从ESP+0x1c这个位置开始的,那么 偏移量=EBP-(ESP+0x1c)+4,这里+4是因为覆盖栈中保存的EBP的数据,才能到程序返回地址。offset=0xffffd158-(0xffffd0d0+0x1c)+4=0x70
下面我们再在IDA中找到调用system函 ...