SQL注入1

一、简介

  • SQL注入时指web应用程序对用户输入的合法性未进行判断、处理、前端传入的参数是攻击者可控的、并且参数被正常带入到数据库查询,攻击者可以构造不同的SQL语句来进行对数据库进行操作,正常情况下,攻击者可以对数据库进行高危操作。

  • sql注入两个条件:

1、带入数据库查询表 ;
2、参数可控,前端带入后端;
原因:未进行严格过滤,判断导致数据带入查询

  • sql注入原理

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

SQL注入漏洞的危害
1、数据库信息泄露;
2、网页篡改:注入出后台管理员,登录后台发布恶意数据。篡改数据;
3、获取webshell:当权限为root且绝对路径被知道时,可以写一句话木马到服务器;
4、网址挂马:拿到webshell或者服务器权限后,将一些网页木马挂在服务器上,攻击别人;
5、获取系统权限:权限足够时,可以获取主机权限;
6、万能密码:利用特定的Payload登录或者其他网页;
7、文件读取:读取敏感文件;

SQL注入类型:

  • 按照数据库类型: Access / mysql /mssql /oracle / db2;
    access:结构(表–列--值)【aspx/asp+access】

  • 按照提交方式:Get / post /cookie / http头 、xff ;

  • 按照注入点类型:数字型、字符型、搜索型;

  • 按照执行效果:布尔盲注、时间盲注、报错注入、联合注入、堆叠查询注入;

  • 站库分离:web服务和数据库放置在不同的服务器上

  • sql注入的一般步骤

1、先进行是否有sql注入的判断;
2、进行数据库的版本判断;
3、进行数据库列的判断:order by /group by;
4、进行数据库库名的获取:select 1,2,database()
5、已知库名后,进行数据库表名的获取:select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1
6、已知数据库名和表名之后,进行字段的查询:select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=user() limit 0,1
7、得到信息之后,可以进行数据的提取(列数为3列时):select 1,username,password from users limit 0,1

  • 防范方式
    1、区分普通用户与管理员的权限;
    2、对参数进行设置与过滤
    3、加强用户身份的验证
    4、设置账号陷阱

二、实战

  • 字符型注入
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1;

id =’$id’ 在进行赋值时是:id=‘1 and 1=1’,输入的语句也会成为字符串,所以在进行输入时,要将单引号进行闭合,让and之后的语句可以正常执行,然后将后面的语句进行注释;

$sql="SELECT * FROM users WHERE id='1'and 1=1 --+ 'LIMIT 0,1;
  • 数字型注入:
    在进行注入前判断是否存在sql注入的问题: ?id=1 and 1=1; ?id=1 and 1=2
    1、进行列的判断:

在这里插入图片描述
在这里插入图片描述
2、进行数据库名的提取
在这里插入图片描述
3、获取数据库的表名:
在这里插入图片描述
4、获取字段:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
或者使用group_concat来进行一行打印:
在这里插入图片描述
在这里插入图片描述
5、获取users用户的密码:
在这里插入图片描述

  • 搜索型注入:

原理:
一些网站为了方便用户查找网站的资源,都对用户提供了搜索的功能,因为是搜索功能,往往是程序员在编写代码时忽略了变量的过滤。
sql语句:select * from news where content like ‘%d%’
like 与 id 不同 and 语句没有效果
【在进行注入时,会有’%d%’ 输入值进行查询时会成为 ‘%a%’,进行闭合时要闭合前面的单引号和百分号或者闭合单引号,其他操作相同】

在这里插入图片描述

  • 宽字节注入(前端utf8,后端gbk):

何为宽字节:
1、当某字符的大小为一个字节时,成为窄字节;
2、当某字节的大小为两个字节时(汉字),为宽字节;
3、所有英文默认占一个字节,汉字占两个字节;
常见的宽字节编码:GB2312,GBK,GB18030,BIG5,Shift_JIS等待;

在进行宽字节注入时:在这里插入图片描述
【插入的单引号会被\转义,所以,要在注入时处理\】

处理思路:

思路一:借鉴程序员的防范思路,对\转义,使其失去意义,成为内容的一部分,但难度较大;
思路二:当MySQL使用宽字节进行编码时,两个连在一起的字符会被认为是汉字,可以在\前加入字符,使其与斜杠连起来成为一个汉字,进而让单引号发挥作用;
注意:前一个字符的ASCII码大于128,两个字符才会组合成为汉字:%df%5c%27,此时的%df%5c会成为繁体字“运”

原理图:
在这里插入图片描述

在这里插入图片描述

注入实践:
1、判断存在注入问题:
在这里插入图片描述
2、进行列数的查询:
在这里插入图片描述

在这里插入图片描述
3、进行数据库库名的查询:
在这里插入图片描述
4、进行表名的查询:
在这里插入图片描述
5、进行字段名的查询:
在这里插入图片描述
【此处我将表名与字段名一同查询打印】
6、进行users表的字段查询:

在这里插入图片描述
在这里插入图片描述
如图输入表名时,会报错,因为单引号被转义了

必须将没有单引号的表名进行进制转换

在这里插入图片描述

在这里插入图片描述
7、进行密码的查询:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值