SQL注入基础

简介: SQL注入基础

一.产生

当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查。

在数据交互中,前端数据传到后台时没有做严格的判断,导致传进来的数据被拼接到sql语句中,被当作sql语句的一部分进行执行,如果代码中没有过滤或者过滤不严谨是会出现漏洞的。 (拓扑图如图一)

二.SQl注入类型:

包括数字型注入、UNION注入、字符型注入、布尔盲注、时间注入、报错注入和堆叠注入等。

1.数字型

数字型注入就是指注入点的数据类型为数字型,没有用单引号引起来。

判断方法:

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

select * from <表名> where id = x

这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

当输入 and 1=1时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=1

没有语法错误且逻辑判断为正确,所以返回正常。(如图二)

当输入 and 1=2时,后台执行 Sql 语句:

select * from <表名> where id = x and 1=2

没有语法错误但是逻辑判断为假,所以返回错误。(如图三)

我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'

查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

参考博客

2.字符型

字符型注入就是注入点的数据类型是字符型。与数字型的区别在于字符型注入要用一对单引号引起来。

字符型判断:

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

select * from <表名> where id = ‘x’

这种类型我们同样可以使用 and ‘1’='1 和 and ‘1’='2来判断:

Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。
 Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and ‘1’='1时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘1’

语法正确,逻辑判断正确,所以返回正确。(图四)

当输入 and ‘1’='2时,后台执行 Sql 语句:

select * from <表名> where id = ‘x’ and ‘1’=‘2’

语法正确,但逻辑判断错误,所以返回错误。(图五)

3.UNION注入 (流程):

依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据.

(1)类型判断(字符型or 数字型)

(2)判断字段数:

例如:id=1’ order by 1 – +(或-- -)

union有一个十分严格的约束条件,因为是联合查询,必选保证字段数一致,即两个查询结果有相同的列数,因此我们要对字段数进行判断,使用 order by number 其作用为输出第number列。(注释符-- +,使后面语句失效)

(图一)

此时页面正常,增加number;

当页面异常时(图二)

number-1即为实际列数。

(3)判断回显点

知道该表的字段数之后,我们还需要确定在哪个字段出会输出有效信息。

联合查询的输出是严格按照顺序进行的,因此当id=1存在时会在第0行输出第一个sql语句查询到的结果,自然我们输入的数字就到了下一行。而 limit num1,num2的作用为从第num1行开始显示num2行内容

我们可以看到2,3被输出了(图三),

说明这两个位置都可以作为回显点。

当然我们也可以不用limit语句,只需让前面sql语句查询结果为空即可(如图四)

(4)爆库名,表名,字段名,数据 同数据库查询方法。

4.堆叠注入

实质就是通过结束符(分号)来执行多条sql语句。

我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束,如果我们想要执行多条sql那就用结束符分号进行隔开。就是在不可控的用户输入中通过传入结束符+新的sql语句来获取想要的息,大致过程如(图五)

触发条件

1.目标存在sql注入漏洞2.目标未对";"号进行过滤3.目标中间层查询数据库信息时可同时执行多条sql语句。

5.布尔盲注

(1)适用情况

没有返回SQL执行的错误信息,

错误与正确的输入,返回的结果只有正确与错误(图一与图二)

(2)相关函数:

left()函数

语法:left (string,n) string为要截取的字符串,n为长度。

payload:name=lili’ and left((select database()),1)=‘p’–+ (图三)

mid()函数:

语法:mid(string, start[, length]) ,string为要提取字符的字段,start为开始截取位置(起始值是1),length为截取的长度(可选,默认余下所有字符)

(图四)

正则表达式 regexp

语法: regexp^【a-z】表示字符串中第一个字符是在 a-z范围内。

regexp ^a 表示字符串第一个字符是a。

regexp ^ab 表示字符串前两个字符是ab。payload:name=lili’ and (select database()) regexp ‘^p’–+ (图五)

like函数:语法:Like 'a%'表示字符串第一个字符是a。 Like 'ab%‘表示字符串前两个字符是ab。%表示为任意值,payload:name=lili’ and (select database()) like ‘p%’–+

(图六)

if语句

语法:if(判断条件,正确返回的值,错误返回的值),注意数据库中的if与后端if不一样,payload:name=lili’ and 1= if(((select database())like ‘p%’),1,0)–+ ,表示如果if语句中的第一个参数为真,则输出第一个值1,不为真输出第二个值0;

(图七)

substr()函数

substr()函数是截取字符串的函数。

语法:substr(string,start,length)

参数string :被截取的字符串。

参数start :截取的起始位置。

参数length :从截取位置截取的长度。

char(x)函数

将x的值转为所对应的字符

payload:name=lili’ and mid((select database()),1,1)=char(112)–+

ord()函数

返回一个字符的ASCII码。

语法:ord(character)

参数character:为单个字符,如果是字符串的话,则只按照字符串的第一个字符计算。

length()函数

length()函数是否返回一个字符串的长度。

语法:length(string)

参数string :为需要输出其长度的字符串。

(3)基本操作步骤:

构造目标查询语句,选择拼接方式,构造判断表达式,提取数据长度,提取数据内容。

目录
相关文章
|
SQL 安全 前端开发
Web学习_SQL注入_联合查询注入
联合查询注入是一种强大的SQL注入攻击方式,攻击者可以通过 `UNION`语句合并多个查询的结果,从而获取敏感信息。防御SQL注入需要多层次的措施,包括使用预处理语句和参数化查询、输入验证和过滤、最小权限原则、隐藏错误信息以及使用Web应用防火墙。通过这些措施,可以有效地提高Web应用程序的安全性,防止SQL注入攻击。
670 2
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
421 5
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
433 5
|
SQL 安全 数据库
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
【7月更文挑战第26天】在 Python Web 开发中, 安全性至关重要。本文聚焦 SQL 注入、XSS 和 CSRF 这三大安全威胁,提供实战防御策略。SQL 注入可通过参数化查询和 ORM 框架来防范;XSS 则需 HTML 转义用户输入与实施 CSP;CSRF 防御依赖 CSRF 令牌和双重提交 Cookie。掌握这些技巧,能有效加固 Web 应用的安全防线。安全是持续的过程,需贯穿开发始终。
351 1
Python Web开发者必学:SQL注入、XSS、CSRF攻击与防御实战演练!
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
365 6
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
420 3
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
339 1
|
SQL 安全 数据库
Python Web开发者必看!SQL注入、XSS、CSRF全面解析,守护你的网站安全!
在Python Web开发中,构建安全应用至关重要。本文通过问答形式,详细解析了三种常见Web安全威胁——SQL注入、XSS和CSRF,并提供了实用的防御策略及示例代码。针对SQL注入,建议使用参数化查询;对于XSS,需对输出进行HTML编码;而防范CSRF,则应利用CSRF令牌。通过这些措施,帮助开发者有效提升应用安全性,确保网站稳定运行。
345 1
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
440 5