分享

一文掌握sql注入

 zZ华 2023-07-12 发布于广东

什么是sql注入漏洞

概念:客户端在接受用户输入的参数并拼接到sql语句中提交给服务端

去数据库中检索相应的结果,但是由于用户输入的参数是恶意查询的参数,所以导致sql语句有恶意查询导致sql注入漏洞。

sql注入型

1、数字型(无符号干扰)

select * from news where id=$id;

2、字符型(有符号干扰)

select * from news where id='$id';

3、搜索型(有多符号干扰)

select * from news where id like '%$id%'

4、框架型(有各种符号干扰)

select * from news where id=('$id');

select * from news where (id='$id');

判断有没有注入点

1.注入点判断方法:   1.1.单引号判断法---经典方法

如果页面返回错误,则存在,字符型、整型都可判断,具体操作在参数的后面加上'就可。                1.2.构造造and 1=1以及and 1=2,用于数字型注入点。   

1.3.构造and '1' ='1'以及and '1' ='2',用于字符型注入点。

2.判断注入点是字符型还是数字:构造payload为:id=1 order by 9999 --+      如果正确返回页面,则为字符型,否则,为数字型。

要掌握的sql基础

1.MYSQL5.0以上版本:自带的数据库名information_schema,遇见的数据库基本都是5.0以上。

2.各对应名:

information_schema:存储数据库下的数据库名及表名,列名信息的数据库

information_schema.schemata:记录数据库名信息的表

information_schema.tables:记录表名信息的表

information_schema.columns:记录列名信息表

schema_name:information_schema.schemata记录数据库名信息的列名值

table_schema:information_schema.tables记录数据库名的列名值

table_name:information_schema.tables记录表名的列名值

column_name:information_schema.columns记录列名的列名值

3.获取相关数据:

3.1、数据库版本-看是否符合information_schema查询-version()

3.2、数据库用户-看是否符合ROOT型注入攻击-user()

3.3、当前操作系统-看是否支持大小写或文件路径选择-@@version_compile_os

3.4、数据库名字-为后期猜解指定数据库下的表,列做准备-database()

4.小细节:查询的结果很多,需要全部显示加上group_concat(),在末尾加上limit 0,1显示第一条数据,limit 0,2 显示第二条数据。后面的数据代表显示多少行从第一个数字后面开始不包括第一个数字的范围。

sql注入点会发在那些参数里面

1.sql注入漏洞要发生的前提是要有数据与数据库进行查询,所以在对网站测试的不仅仅在id参数等进行测试,比如User-Agent字段,如果每一个客户端在请求网站时服务器都记录了此字段并保存到数据库中,这个过程与数据库有着交互,那么也有可能存在sql注入,数据包请求头任何参数都有可能成为sql注入的点,列举几个参数。

User-Agent:

使得服务器能够识别客户使用的操作系统,游览器版本等.(很多数据量大的网站中会记录客户使用的操作系统或+

浏览器版本等存入数据库中)

Cookie:

网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,(通常一些网站的防注入功能会记录请求端真实IP地址并写入数据库or某文件[通过修改XXF头可以实现伪造IP]).

Rerferer:浏览器向 WEB 服务器表明自己是从哪个页面链接过来的.

Host:客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号

在拿到一个网站的时候判断其功能点,比如一个网站你发现判定你的ip来让你可不可以登入,说明在数据库存储了ip进行比对,与数据库有着交互,这个时候可以尝试进行xff注入。其他点也可以像这样去判断。

盲注

盲注:就是在注入过程中,获取的数据不能回显至前端页面。我们需要利用一些方法进行判断或者尝试,这个过程称之为盲注。

1、基于布尔的SQL盲注-逻辑判断

regexp,like,ascii,left,ord,mid

2、基于时间的SQL盲注-延时判断

if,sleep

3、基于报错的SQL盲注-报错回显

floor,updatexml,extractvalue

延迟:

and sleep(1);

and if(1>2,sleep(1),0);

and if(1<2,sleep(1),0);

布尔:

and length(database())=7;

and left(database(),1)='p';

and left(database(),2)='pi';

and substr(database(),1,1)='p';

and substr(database(),2,1)='i';

and ord(left(database(),1))=112;

报错:

and updatexml(1,concat(0x7e,(SELECT version()),0x7e),1)

and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

二次注入

二次注入:是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。

二次注入主要分为两步

第一步:插入恶意数据

第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身就包含恶意内容

第二部:引用恶意数据

在将数据存入到了数据库中之后,开发者就认为数据是可信的,在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,就会造成二次注入

堆叠注入

堆叠注入:在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下,我们在结束一个sql语句后继续构造下一条语句,会不会一起执行? 因此这个想法也就造就了堆叠注入。

前提:

有注入点:即存在sql注入漏洞

未过滤:即未对';'号进行过滤

未禁用:即未禁止执行多条sql语句

(基本后续都是用工具进行扫,此步骤就不详细写)

如何防护sql注入

1、对用户进行分级管理,严格控制用户的权限;2、在书写SQL语言时,禁止将变量直接写入到SQL语句,必须通过设置相应的参数来传递相关的变量;

3、在具体检查输入或提交的变量时,对于单引号、双引号、冒号等字符进行转换或者过滤;

4、使用安全参数;

5、通过专业的扫描工具,可以及时的扫描到系统存在的相应漏洞;

6、多层验证;

7、数据库信息加密。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多