WEB安全漏洞(持续更新)


#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

  • 让自己的前端页面发出的请求和伪造的请求不一样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MUNG东隅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值