官方公众号企业安全新浪微博
FreeBuf+小程序把安全装进口袋
结构化查询语言(Structured Query Language,缩写:SQL),是一种特殊的编程语言,用于数据库中的标准数据查询语言。1986年10月,美国国家标准学会对SQL进行规范后,以此作为关系式数据库管理系统的标准语言(ANSI X3. 135-1986),1987年得到国际标准组织的支持下成为国际标准。不过各种通行的数据库系统在其实践过程中都对SQL规范作了某些编改和扩充。所以,实际上不同数据库系统之间的SQL不能完全相互通用。
危害较高的漏洞,可以获取敏感信息,修改信息,脱裤,上传 webshell,执行命令。
数字上是不加单引号的如’2’+‘2’=‘22’而非’4’而2+2=4
sql注入主要是靠内联SQL来进行注入的and or 与或非的判断来进行内联SQL注入,等于在原先的语句上扩展出来的语句
报错注入顾名思义主要是利用数据库报错来进行判断是否存在注入点。如果不符合数据库语法规则就会产生错误。常用的特殊字符:’ \ ; %00 ) ( # "
1)函数length()计算数据库长度
2)函数left(a)=bsql的left()函数如果式子成立返回1如果不成立返回0
一般用来猜测库的名字3)函数substr()substr()和substring()函数实现的功能是一样的,均为截取字符串。substring(string, start, length)substr(string, start, length)length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本
可进行单字符验证可进行全字符验证4)函数mid()mid(string,start,length)string(必需)规定要返回其中一部分的字符串。start(必需)规定开始位置(起始值是 1)。length(可选)要返回的字符数。如果省略,则 mid() 函数返回剩余文本
可进行单字符验证可进行全字符验证
5)函数ascii()返回字符串str的最左字符的数值。返回0,如果str为空字符串。返回NULL,如果str为NULL。 ASCII()返回数值是从0到255;只会返回最左边字符的可以配合substr()
7)函数updatexml()
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。第三个参数:new_value,String格式,替换查找到的符合条件的数据在当前数据库中演示
8)函数exp()exp是以e为底的指数函数。可能会存在溢出
由于数字太大是会产生溢出。这个函数会在参数大于709时溢出,报错
如果成功注入会正确显示内容,如果没成功会显示非正常内容。
没有任何报错显示,但是能根据页面是否正确显示来进行判断。如搜索注入没有内容,正常搜索应该是有内容的。
如果exp1为true返回值为sleep,如果为假返回值为1。ps:前提是网络延迟较低的情况。。
通过分号隔开执行多条语句。
前面不存在才会执行后面的语句,一般配合的是布尔类型的盲注
在存入数据库的时候做了过滤,但是取出来的时候没有做过滤,而产生的数据库注入。
数据库大多数为GBK才可以%df
cookie中的参数也有可能存在注入
Base64
X-Forwarded-for伪造客户端IP
dnslog
通过上述所有的注入方式进行组合攻击,如union+盲注
本地访问
limit 后使用 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1) 这种方式触发 sql 注入,受到 Mysql 版本的限制,其区间在 Mysql 5.1.5 - Mysql5.5 附近。
注释符号:--空格,/* */内联注释,# Mysql–后面要加一个空格或者控制字符要不无法注释‘a’ ‘b’=‘ab’
端口号:1433注释符号:--,/* */注释‘a’+‘b’=‘ab’
端口号:1521注释符号:--,/* */注释‘a’||‘b’=‘ab’
端口号:5432或者5433注释符号:--,/* */注释‘a’||‘b’=‘ab’
端口号:5000SQLite一种数据库文件,特别小,就一个库多个表,可用sqlite或者sqlite2打开
端口号:27017
ASP站点’or’=‘or’
前提:知道文件的绝对路径能够使用 union 查询对 web 目录有写的权限union select 1,load_file('/etc/passwd'),3,4,5#0x2f6574632f706173737764union select 1,load_file(0x2f6574632f706173737764),3,4,5#路径没有加单引号的话必须转换十六进制要是想省略单引号的话必须转换十六进制
前提:文件名必须是全路径(绝对路径)用户必须有写文件的权限没有对单引号'过滤
路径里面两个反斜杠\可以换成一个正斜杠/PHP 语句没有单引号的话,必须转换成十六进制要是想省略单引号'的话,必须转换成十六进制
建议一句话 PHP 语句转换成十六进制
这里我们采用DVWA靶场进行手工测试。
DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。
本地PHPStudy搭建DVWA靶机,放入www目录下即可环境使用PHP+MySQL即可。
(1)SQL Injection其他难度主要是为绕过手段。
判断是否存在注入在这里使用一个分号来进行扰乱数据库
查看数据库,发现命令没有生效
使用%23来把后面的内个分号进行注释,这里不能使用#因为#为php的锚点不会传递到服务器。可以正常查询
数据库中发现#把后面的引号注释掉了导致语句成功执行
利用这个特性来进行注入构造语句id=1'or 1=1%23因为后面1=1为真就会把全部的字段全部输出出来。
改一下代码显示sql语句。
(2)堆叠注入
不知道为何会报错把这条语句复制下来在mysql命令行输入没有报错正常显示
第一步先进行字段数量判断order by xx
order by 3的时候出现了报错说明为2个字段代码中也能体现,但是如果是渗透测试是看不见数据库命令的只能通过这个去尝试
得出2个字段后进行union注入id=1'union+select+1,2%23
1和2都显示了说明都可以进行替换。
first_name,password再去构造查询语句
直接去查询他的表对应的字段就简单了
所以只需要记住information_schema库下的columns表中的字段就可以了库是table_schema,表是table_name,字段是column_name
盲注即为不回显内容需要进行尝试根据页面返回的内容是否正常来进行判断
说明存在盲注
(5)内联注入
直接用内联注入简单快捷。。
用length(database())=xx来判断数据库名长度如果成立就会返回正常
说明数据库名为4位
1' and mid(database(),1,1)<'g'#使用mid来判断数据库第一位的内容只需要修改第二个标志位来判断位数如果为正确就会返回存在ID
1' and mid(database(),2,1)='v'#
后面就省略了。之后会有脚本教学进行判断
(1)SQL Injection
只做绕过不进行详细测试。
发现只是改成了POST型,加了个过滤特殊符号的函数,改成了数字型注入。
成功注入
一样就是改成了POST和过滤,数字型盲注。
正常绕过了
(1)SQL Injection
通过外部传递进来的session的id和限制一次只能显示一行
绕过了limit的限制
成功注入
需要特别提到的是,High级别的查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入。
跟上面差不多这个是Cookie的传递id,limit也是限制显示一行
成功绕过
(1)SQL Injection
做了个CSRF的防御,使用了PDO进行了分离数据和参数
先判断了一下id是否为数字如果不为数字直接就会跳过数据库查询,bindParam把id转换为int型,防止输入的数字为字符。进行查询有效限制了恶意构造语句
(2)SQL Injection(Bind)
跟如上一样
继续对DVWA靶场进行测试。
多用于盲注,这里只演示盲注
(1)Options
(2)Target
(3)Request
(4)Optimization
(5)Detection
(6)Techniques
(7)Fingerprint
(8)Enumeration
(9)Brute force
(10)User-defined function injection
(11) File system access
(12) Operating system access
(13) Windows registry access
(14) General
(15) Miscellaneous
(1)查看当前数据库
(2)查看当前用户
(3)查看全部数据库
(4)查看数据库全部表
(5)查看表字段
(6)查看数据
WebGoat是OWASP组织研制出的用于进行web漏洞实验的Java靶场程序,用来说明web应用中存在的安全漏洞。WebGoat运行在带有java虚拟机的平台之上,当前提供的训练课程有30多个,其中包括:跨站点脚本攻击(XSS)、访问控制、线程安全、操作隐藏字段、操纵参数、弱会话cookie、SQL盲注、数字型SQL注入、字符串型SQL注入、web服务、Open Authentication失效、危险的HTML注释等等。
(1)SQL Injection (advanced)
输入除非字符型注入admin' or '1'='1
7能正常显示8就不可以正常显示了说明字段为7个
Smith' union select 1,'2','3','4','5','6',7 from user_data --
Smith' union select 1,database(),user_name,password,'5','6',7 from user_system_data --
(2)SQL Injection (mitigation)
防御sql注入,其实就是session,参数绑定,存储过程这样的注入。
上面说的方式也不是能够绝对的进行sql注入防御,只是减轻。
如参数绑定方式可以使用下面方式绕过。通过使用case when语句可以将order by后的orderExpression表达式中添加select语句。
Damn Small Vulnerable Web (DSVW) 是使用 Python 语言开发的 Web应用漏洞 的演练系统。其系统只有一个 python 的脚本文件组成, 当中涵盖了 26 种 Web应用漏洞环境, 并且脚本代码行数控制在了100行以内, 当前版本v0.1m。需要python (2.6.x 或 2.7)并且得安装lxml库
安装python-lxml,再下载DSVW
(1)Blind SQL Injection (boolean)
说明存在盲注
构造语句进行盲注,发现不能使用mid只能使用substr。。
(2)Blind SQL Injection (time)
(3)UNION SQL Injection
基于联合查询注入: 使用UNION运算符用于SQL注入,UNION运算符是关联两个表的查询结果。攻击者故意伪造的恶意的查询并加入到原始查询中, 伪造的查询结果将被合并到原始查询的结果返回,攻击者会获得其他表的信息。
这里我们采用Vulnhub靶场进行演练。
Vulnhub是一个提供各种漏洞环境的靶场平台,供安全爱好者学习渗透使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目标。
Graceful的VulnVM是在虚拟机上运行的Web应用程序,它旨在模拟一个简单的电子商务风格网站,该网站特意容易受到Web应用程序中常见的许多众所周知的安全问题的影响。这实际上是该项目的预发布预览版,但它确实具有实用性,但我计划在不久的将来对此进行大量工作。
该计划最终使应用程序容易受到大量问题的影响,选择不同的过滤器处于不同的困难,以便测试人员能够更好地检测和利用应用程序可以通过常见的开发方法加强的问题,以便测试人员能够更广泛的经验。
第一批过滤器现已实施!该应用程序现在支持“级别”,其中级别1不包括用户输入的实际过滤,级别2包括针对每个易受攻击的功能的简单过滤器。
构造语句爆破数据库名,使用之前的python脚本进行爆破。
爆破出来数据库名为seattle
判断出来数据库存在3个表
三个表名
开始爆字段,用如下语句
一直爆不出来字段,发现原来是这种爆破脚本存在一个无法分辨大小写的问题。改进一下脚本,变成ASCII的判断。
重新尝试爆破字段,改一下语句,用python来跑
再去爆破数据。用户名
密码
说明存在5个字段
进行UNION注入构造语句,发现并没有显示位。所以只能进行报错盲注了
跟上面几乎一样,就是利用的地方不一样
可以自定义关键字建立数组即可
把查询语句弄成一个对象,通过函数判断输入进来的值是否为数字,然后再通过正则替换内容
使用参数化查询可有效避免SQL注入
五指互联由原盛大集团PHPCMS负责人王参加创办,汇聚众多国内资深CMS开发者,拥有一支战斗力强、专业的技术团队,有超过10年的CMS专业开发经验。
网站源码版本:五指CMS v4.1.0 UTF-8 开源版
构造url链接,使用SQLMAP可获取数据库敏感数据。
Payload:
抓包把数据包放到sqlmap上跑
可以自定义关键字建立数组即可
把查询语句弄成一个对象,通过函数判断输入进来的值是否为数字,然后再通过正则替换内容
使用参数化查询可有效避免SQL注入
单引号(’)双引号(")反斜杠(\)NULL
预定义的字符是:& (和号)成为 &" (双引号)成为 "’ (单引号)成为 ’<>成为 <>就是把成变成一个纯字符(:з」∠)
会在以下关键词前面添加转义字符单引号(’)双引号(")反斜杠(\)NULL