SQL注入:
基础:
1. SQL注入的原理:
SQL注入漏洞的产生需要满足以下两个条件。
• 参数用户可控:前端传给后端的参数内容是用户可以控制的。
• 参数代入数据库查询:传入的参数拼接到SQL语句,并且带入数据库查询。
-
MySQL与SQL注入相关的知识点:
• 在MySQL5.0版本后,MySQL默认在数据库中存放一个‚information_schema‛的数据库,在该库中,我们需要记住三个表名,分别是schemata,tables,columns。
• Schemata表存储的是该用户创建的所有数据库的库名,需要记住该表中记录数据库名的字段名为schema_name。
• Tables表存储该用户创建的所有数据库的库名和表名,要记住该表中记录数据库库名和表名的字段分别是table_schema和table_name.
• Columns表存储该用户创建的所有数据库的库名、表名、字段名,要记住该表中记录数据库库名、表名、字段名为table_schema、table_name、columns_name -
函数:
• Version();当前mysql的版本
• Database();当前网站使用的数据库
• User();当前MySQL的用户
• group_concat():查询同类所有数据 -
注释符号
• #
• --空格 空格可以使用+代替
• /**/ -
SQL注入漏洞探测方法
(1).整型参数的判断当输入的参数YY为整型时,通常abc.asp中SQL语句大致如下:select * from 表名 where 字段=yy
(2)字符串型参数的判断
当输入的参数YY为字符串时,通常abc.asp中SQL语句大致如下:
select * from 表名 where 字段=‘YY’ -
SQL注入点类型:
• 数字型 ID= I D • 字 符 串 型 U S E R N A M E = ‘ ID • 字符串型 USERNAME=‘ ID•字符串型USERNAME=‘USERNAME’
• 搜索型 text LIKE ‘%{$_GET[‘search’]} -
Union注入攻击:在mysql中可以用来查询指定数据
• Union联合查询思路:
• a.判断是否存在注入点。id=1, id=1’, and 1=1,and 1=2
• b.order by 1-99 语句来查询该数据表的字段数量,如果id=1 order by 1,
返回结果和id=1一样, id=1 order by 2返回结果和id=1一样, id=1 order
by 3则出现和id=1不同的结果,则可以判断字段数为2。
• c.利用获得的列数使用联合查询,union select 与前面的字段数一样。如
union select 1,2。
• d.根据显示内容确定查询语句的位置,利用information_schema依次进行查
询schemata,tables,columns 。information_schema.tables -
Boolean 注入攻击(盲注)
• 有些情况下,开发人员屏蔽了报错信息,导致攻击者无法通过报错信息进行注 入的判断。这种情况下的注入,称为盲注。 盲注根据展现方式,分为boolean型盲注和时间型盲注。
• Boolean是基于真假的判断(true or false); 不管输入什么,结果都只返回真或假两种情况;通过and 1=1和and 1=2可以发现注入点。
• Boolean型盲注的关键在于通过表达式结果与已知值进行比对,根据比对结果 判断正确与否。
• Boolean型盲注的判断方式有:
• 通过长度判断length():select length(database())>=x
• 通过字符判断substr():select substr(database(),1,1) =‘s’
• 通过ascII码判断:ascii():select ascii(substr(database(),1,1))
需要利用burpsuite逐字爆破,后面查询语句和联合查询一样。 -
报错注入攻击
• 在MYSQL中使用一些指定的函数来制造报错,后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端,从而从报错信息中获取设定的信息。
• select/insert/update/delete都可以使用报错来获取信息。
• 常用的爆错函数updataxml(),extractvalue(),floor()
• 基于函数报错的信息获取(select/insert/update/delete)
• updataxml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数;
• extractvalue()函数也是MYSQL对XML文档数据进行查询的XPATH函数;
• floor()函数是MYSQL中用来取整的函数。
语法:updatexml(xml_document,Xpathstring,new_value)
• payload1:updatexml(1,concat(0x7e,(select database()),0x7e),1)
• payload2: extractvalue(1, concat(0x7e,(select database()),0x7e))
• payload3:(select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables group by x)a)#
查询语句和联合查询相同。
进阶
- 时间盲注攻击
• 时间盲注:利用sleep()或benchmark()等函数让mysql执行时间变长经常与
if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否
正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回
expr3。
• 时间型盲注特点:
• 通过时间回显的延迟作为判断
• 利用sleep()或benchmark()函数延长mysql的执行时间
• 与if()搭配使用
时间盲注常用函数
• left(m,n) --从左向右截取字符串m返回其前n位
• substr(m,1,1) --取字符串m的左边第一位起,1字长的字符串
• ascii(m) --返回字符m的ASCII码
• if(str1,str2,str3)–如果str1正确就执行str2,否则执行str3
• sleep(m)–使程序暂停m秒
• length(m) --返回字符串m的长度
• count(column_name) --返回指定列的值的
利用:
• 时间型盲注payload:if(expr1,expr2,expr3) 语义解析:
• 对expr1进行布尔判断,如果为真,则执行expr2,如果为假,则执行expr3
• 常用payload:
a.If(length(database())>1,sleep(5),1) 如果数据库名字符长度大于1为真,mysql休眠5秒,如果为假则查询1
b.而查询1的结果,大约只有几十毫秒,根据Burp Suite中页面的响应时间,可以判断条件是否正确
与boolean盲注使用burpsuite方法相同
-
堆叠查询注入攻击
• 堆叠查询可以执行多条语句,多语句之间使用‛;‛分开。堆叠查询注入就是利用这个特点,
在第二个SQL语句中构造自己要执行的语句。首先访问id=1’,页面返回MYSQL错误,再访问id=1’%23,页面返回正常结果。这里可以使用Boolean注入,时间注入,也可以使用另外一种注入方式—堆叠注入。
• 正常sql语句:Select * from users where id=‘1’;
• 注入sql语句:Select * from users where id=‘1’;select if(length(database())>5,sleep(5),1)%23;
• Payload= ‘;select if(length(database())>5,sleep(5),1)%23
• Payload= ‘;select if(substr(user(),1,1)=‘r’,sleep(3),1)%23 如此句:从堆叠注入语句中可以看出,
第二条SQL语句(select if(substr(user(),1,1)=‘r’,sleep(3),1)%23就是时间盲注的语句。
• 堆叠注入和union的区别在于,union后只能跟select,而堆叠后面可以使用insert,update,
create,delete等常规数据库语句。 -
二次注入
Sql注入存在两个页面,一个提交精心构造的数据在另一个页面执行时会报错。
(1)攻击者在http请求中提交恶意输入
(2)恶意输入保存在数据库中
(3)攻击者提交第二次http请求
(4)为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句
(5)如果攻击成功,在第二次请求响应中返回结果 -
宽字节注入
在进行php 连接mysql 时,当设置”ser character_set_client=gbk” 时会导致一个编码转换的注入问题,也就是熟悉的宽字节注入
当存在宽字节注入时,%df%27 可把程序中过滤的\ (%5c)吃掉。
例如:/1.php?id=1存在宽字节注入时,则: /1.php?id=-1’and 1=1%23 单引号会被转义成 ’
(1)正常情况下GPC开启或者使用addslashes函数过滤GET或POST提交的参数时,我们测试输入的’,就会被转义为’;
(2)若存在宽字节注入,输入%df%27时,经过单引号的转义变成了%df%5c%27,之后再数据库查询语句进行GBK多字节编码,即一个中文占用两个字节,一个英文同样占用两个字节且在汉字编码范围内两个编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成汉字"運",单引号逃逸出来,从而绕过转义造成注入漏洞。
- cookie注入
什么都不输入,就有查询页面出现。说明存在cookie,使用burp抓包,修改cookie值为查询语句,就可进行注入。
6.Base64编码:
注入语句用burp或其他工具进行base64编码,再进行正常注入
SQL注入绕过:
• 双写绕过
• 大小写绕过:大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式
/express/i 大小写不敏感即无法绕过,
• 替换关键字:这种情况下大小写转化无法绕过,而且正则表达式会替换或删除select、union这些关键字,如果只匹配一次就很容易绕过
• 编码绕过注入:十六进制、Unicode编码、URL:由于服务器会自动对URL进行一次URL编码,所以需要把关键字编码两次,这里需要注意的地方是,URL编码需要选择全编码,而不是普通的URL编码。
• 使用注释:
(1) 普通注释://, – , //, #, --+,-- -, ;,–a;//在构造得查询语句中插入注释,规避对空格的依赖或关键字识别;#、–+用于终结语句的查询
(2) 内联注释:相比普通注释,内联注释用的更多,它有一个特性/!**/只有MySQL能识别
• 等价函数与命令:
(1)函数或变量
hex()、bin() ==> ascii()
sleep() >benchmark()
concat_ws()>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
(2)符号:and和or有可能不能使用,或者可以试下&&和||能不能用;还有=不能使用的情况,可以考虑尝试<、>,因为如果不小于又不大于;空格可以使用如下符号表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/
(3)生僻函数:updatexml《》xmlelement《》extractvalue
•特殊符号
• HTTP参数控制
• 缓冲区溢出
• 整合绕过
• SQL注入修复
XSS注入:
XSS:跨站脚本(Cross-Site Scripting),简称为XSS或CSS或跨站脚本攻击,是一种针对
网站应用程序的安全漏洞攻击技术,是代码注入的一种。它允许用户将恶意代码注入网页,其他用户在浏览网页时就会受到影响。恶意用户利用XSS代码攻击成功后,可能得到很高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
(1)反射性:非持久型XSS,这种攻击方式往往具有一次性。
(2)存储型:持久型XSS,攻击脚本将被永久地存放在目标服务器的数据库或文件中,具有很高的隐蔽性。
(3)DOM型:DOM全称Document Object Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容、结构及样式。DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象模型的一种。
漏洞。
利用流程:
a. 用firefox和chrome的右键菜单进入html编辑器或者直接查看网页源代码。
b. 寻找输入点,在输入点输入特殊字符<>’’等,查看是否存在拦截,并且通过编辑器查看输入后存放的位置。
c. 发现没有过滤特殊字符后,就要考虑如何构造payload进行xss攻击了。开始分析漏洞页面,构建payload。
d. 弹窗或其他。构造、、
利用网站生成攻击语句获取cookie或其他。http://xsshs.cn
利用cookie:到burp抓包,修改cookie值后放包,可以无验证登录。
常用语句:
<scrip>alert(/xss/)</scrip>
<img src=x onerror=alert(/xss/)>
<svg onload=alert(xss/)>
<a href=javascript:alert(/xss/)>
xss修复建议:因为XSS漏洞涉及输入和输出两部分,所以其修复也分为两种。
(1)过滤输入的数据:包括““” “<“ “>” “on”
等非法字符。
(2)对输出到页面的数据进行相应的编码转换:包括HTML实体编码,JavaScript 编码等。
CRSF攻击:
crsf(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
CSRF攻击原理比较简单,其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
a. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
b. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
c.用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
d.网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
**(**网站B对网站A发出一个请求的同时,浏览器也会把网站A产生Cookie信息带上)–相当于浏览器访问网站A—这是user信息被盗用的关键
e.浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF漏洞防御:
(1) 服务端的防御:目前业界服务器端防御CSRF攻击主要有三种策略:验证HTTP Referer字段,在请求地址中添加token并验证,在HTTP头中自定义属性并验证。下面分别对这三种策略进行简要介绍。
(2) 用户端的防御:对于普通用户来说,都学习并具备网络安全知识以防御网络攻击是不现实的。但若用户养成良好的上网习惯,则能够很大程度上减少CSRF攻击的危害。
SSRF攻击:
ssrf:在服务器中放置一个脚本,用其作为跳板访问内外网和资料。
上传文件漏洞:
由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意 PHP 文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意 PHP 脚本。
成功攻击的条件:
(1)可以上传任意脚本文件,且上传的文件能够被Web服务器解析执行,具体来说就是存放上传文件的目录要有执行脚本的权限。
(2)用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。
(3)知道文件上传到服务器后的存放路径和文件名称,因为许多Web应用都会修改上传文件的文件名称,那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你上传了也无法访问。
文件上传漏洞检测点:
A 客户端 javascript 检测 (通常为检测文件扩展名)
B 服务端 MIME 类型检测 (检测 Content-Type 内容)
C 服务端目录路径检测 (检测跟 path 参数相关的内容)
D 服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
E 服务端文件内容检测 (检测内容是否合法或含有恶意代码)
具体检测漏洞:
(1)客户端js检测:
检测方式:
这类检测通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测扩展名是否合法。
绕过方式:
a.在前端的JavaScript代码中白名单中添加需要上传的文件后缀
b.删除掉调用的验证文件后缀的函数
c.用抓包工具将可以上传的文件格式修改为需要上传的文件格式
(2)服务端 MIME 类型检测
检测方式:
MIME类型与文档的后缀相关,因此服务器可以使用文档的后缀来区分不同文件的MIME类型。服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-type关键字进行定义
绕过方式: 用抓包工具将数据包信息中Content-type关键字对应的文件格式进行修改。
(3)目录路径检测
检测方式:
目录路径检测,一般就检测路径是否合法
绕过方法:
a.用0x00进行截断
b.在路径中设置一个.asp的文件,利用解析漏洞
(4)服务端文件扩展名检测
/1黑名单检测
检测方式:
黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多。一般有个专门的blacklist文件,里面会包含常见的危险脚本文件扩展名,例如下图为fckeditor2.4.3或之前版本的黑名单。
绕过方式:
a.文件名大小写绕过:
用像AsP, pHp之类的文件名绕过黑名单检测
b.名单列表绕过:
用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类
c.特殊文件名绕过:
比如发送的http包里把文件名改成test.asp. 或 test.asp_(下划线为空格),这种命名方式在windows系统里是不被允许的,所以需要在burp之类里进行修改,然后绕过验证后,会 被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
d.0x00截断绕过:
扩展名检测
这一块目前只遇到过asp的程序有这种漏洞,比如,上传的文件名叫test.asp.jpg(asp后面为0x00),在gettype()函数里处理方式是从后往前扫描扩展名, 所以判断为jpg文件,但在保存文件时却是以0x00作为文件名截断,最后以test.asp存入路径里 e.htaccess文件攻击配合名单列表
绕过:
上传一个自定义的.htaccess,就可以轻松绕过各种检测
f.解析调用/漏洞绕过:
这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞
/2白名单检测
检测方法: 白名单检测只允许特定的文件扩展名才能上传,相对来说比黑名单安全一些,但也不见得就绝对安全。
绕过方法:
a.0x00截断绕过:
用像 test.asp%00.jpg的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑 漏洞进行攻击,目前我只遇到过 asp的程序有这种漏洞 b.解析调用/漏洞绕过:
这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用漏洞
(5)服务端文件内容检测
/1文件幻数检测
检测方法:
检测文件头,比如 : jpg文件的文件头为:FF D8 FF E0 00 10 4A 46 49 46 gif文件的文件头为:47 49 46 38 39 61 png文件的文件头为:89 50 4E 47
绕过方式:
在文件幻数后面加上自己的一句话木马代码就行
/2文件相关信息检测
检测方法:
图像文件相关信息检测常用的就是getimagesize()函数,只需要把文件头部分伪造好就ok了,就是在幻数的基础上加了一些文件信息
绕过方式:
在文件的首部加入 GIF89a 可绕过
/3文件加载检测
检测方法:
一般是调用API或函数去进行文件加载测试。常用的是图像渲染测试,或者进行二次渲染
绕过方式:
a.对渲染/加载测试的攻击方式 代码注入绕过(在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区,对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的)
b.对二次渲染的攻击方式 二次渲染即文件上传时会被渲染,下载回来后还会被重新渲染,常见方式是攻击文件加载器自身(常见的是溢出攻击),上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode
3.文件上传漏洞解决方案
(1)检查是否判断了上传文件类型及后缀
(2)定义上传文件类型白名单,即只允许上传的文件类型
(3)文件上传目录禁止脚本解析
(4)对上传后的文件使用随机数改名
命令执行漏洞:
应用程序有时需要调用一些执行系统命令的函数,如在PHP中,使用system.exec,shell_exec,passthru,passthru,popen,proc_popen等函数可以执行系统命令,当黑客能控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
NMAP的使用
#基础操作
~~
1.扫描单个ip
Nmap 172.16.13.45
2.扫描多个ip
Nmap 172.16.13.45 172.16.13.49
3.扫描一个范围的目标地址
nmap 172.16.13.45-49
4.扫描一个范围内的目标地址
5.扫描主机列表targets. txt中所有的目标地址
nmap -iL target.txt
6.扫描除某一目标地址之外的所有目标地址
nmap 172.16.1.100/24 -exclude 172.16.1.110
7.扫描除某一文件中的目标地址之外的目标地址
Nmap 172.16.1.100/24 –excludefile targests.txt
8.扫描除某一.目标地址的21、22、23、80端口
Nmap 172.16.1.100 –p 21,22,23,80 |
9.对目标地址进行路由追踪
Nmap --traceroute
10.扫描目标地址所在C段的在线状态
Nmap –sP IP地址/24
11.目标地址的操作系统指纹识别
Nmap –O
12.目标地址提供的服务版本检测
Nmap –sV
13.探测防火墙状态
nmap –sF –T4
**
**
14.暴力破解攻击
nmap --script=brute 172.16.13.76
15.扫描常见漏洞
nmap --script=vuln 172.16.13.76
16.利用ms17-010
漏洞攻击:
17.探测局域网内更多服务开启的情况
Nmap –n –p 445 –script=broadcast 172.16.13.76
- Whoi s解析
Nmap –script external 172
19.打开防火墙关闭icmp,使用nmap对其进行探测判断是否存活
开防火墙之后