sql注入
常用的mysql语句
创建mysql用户
#‘host’的值为指定哪些ip可以登录,值为‘%’表示任何人可以登录,值为'localhost'仅允许本机登录
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
此处创建用户名为test, 密码为123456

读取文件内容

写入文件内容

注意:如果不能写入文件,先查看mysql的配置文件,若secure_file_priv的值为NULL, 请修改mysql.ini文件
修改mysql.ini 文件,在[mysqld] 下加入secure_file_priv =,随后重启mysql服务

修改mysql.ini 文件,在[mysqld] 下加入secure_file_priv =,保存,重启mysql。
时间盲注常用语句
sleep(秒数)

if(条件,true,false)

length(字符串)
mid(str,首位,个数)


limit(start, length), 参数start是从0开始的
报错注入常用语句
extractvalue(1,sql注入语句)
updatexml(1,sql注入语句,0)
mysql自带的总表
Information_schema:mysql5.0以上版本自带数据库,记录当前数据库所有数据库名、表名、列名
Information_schema.schemata
存放所有数据库名的表
information_schema.tables
存放所有表名的表
Information_schema.columns
存放所有列名的表
table_name
表的列名
column_name
列的列名
table_schema
数据库的列名,存在于information_schema.tables与Information_schema.columns
schema_name
数据库的列名,只存在information_schema.schemata这张表中
Sql注入类型
联合查询注入
1.判断是否存在注入
2.判断列名数量
3.判断那些列名能显值
因为要确定将sql注入语句写入到能显值得列名中
4.获取所有数据库名
5.获取指定数据库的所有表名
6.获取指定表的所有列名
7.获取指定数据库、表、列下的值
基于时间的盲注
1.猜当前数据库名字的长度:
2.猜当前数据库的名字:
3.猜指定数据库的表的长度:
4.猜指定数据库的表的名字:
5.猜指定表的字段的长度:
6.猜指定表的字段的名字:
7.猜指定数据库,表名、列名的值:
基于布尔的盲注
和上面的时间盲注流程差不多
四种报错注入
1.Insert注入
针对用户注册页面,可以在账号框或者密码框注入sql语句, 这里演示在密码框插入sql语句
payload: mima' or updatexml (1,concat(0x7e,(version()),0),0) or '
构成的完整sql语句: INSERT INTO news(users,pass) VALUES ('xf123er','mima' or updatexml (1,concat(0x7e,(version()) or '')
2.update注入
针对用户信息修改页面,例如个人资料修改、用户密码修改等,这里就用修改用户密码举例
注入时要确保用户名是真实存在的, 否者sql语句将不会执行
用户名框输入admin; 密码框注入sql语句: faker’or updatexml(2,concat(0x7e,(version())),0)or'
构成的完整sql语句:update users SET password='faker’or updatexml(2,concat(0x7e,(version())),0)or''where username='admin'
3.delete注入
针对删除信息页面, 例如删除用户、删除数据等,
在用户名输入框注入sql语句: admin' or updatexml(2,concat(0x7e,(version())),0)#
构成的完整sql语句:delete from sqlfaker where username= 'admin' or updatexml(2,concat(0x7e,(version())),0)#'
简单来说sql语句中where = ?, 这个?必须是真实存在的, 若不存在整段sql语句就不会执行
4.limit注入
注意: limt注入仅适用与mysql5.X版本
针对查询前几行的信息页面, limit后面接上procedure analyse()函数实现报错注入
analyse()的参数有两个, 第一个参数填extractvalue报错注入语句, 第二个参数随便填个数字
sql注入常用绕过
1.HEX编码绕过单双引号过滤
通过对表名、列名和数据库名进行HEX编码, 可有效绕过单双引号过滤机制

2.参数加密注入
有些url里的参数是加密的,网站服务器在收到url加密过的参数时会对其进行解密,面对这种情况要先知道url参数采用的是什么加密方式, 然后对sql注入语句进行相应的加密
如下图所示,此网站都url参数采用base64编码, 那么我们的sql注入语句也要使用base64编码


3.宽字节绕过单双引号过滤
源于开发人员设置Mysql连接时的错误配置, mysql若采用gbk的编码格式, 则会将两个字节识别成一个汉字
涉及注入的php函数addslashes() ,其作用是在每个单双引号前添加反斜杠,如下图所示

将闭合符号由单(双)引号修改成%df'
简单来说就是%df'就是把\吃掉然后变成了�\' , 由此来实现符号闭合

1%df' union select 1,user(),3 #

万能密码注入
介绍
一些后端代码会通过查询返回的行数来判断是否登录成功,若查询返回的是一行或多行, 后端代码会识别成登录成功
此处演示的sql查询语句: select * from users where user='$user' and pass='$password'
user字段注入
构造user字段的值: admin'#
完整sql查询语句: select * from users where user='admin'#' and pass='$password'
实际sql查询语句: select * from users where user='admin'

pass字段注入
**构造pass字段的值: ** 'or 1=1 or'
完整sql查询语句: select * from users where user='$user' and pass=''or 1=1 or''
实际sql查询语句: select * from users where true
mysql逻辑判断是从前往后排,==假and假or真or假==的整体逻辑为==真==

常用万能密码
PDO技术防御sql注入
调用quote函数
预处理sql语句:
1、通过命名参数防止注入
2、通过问号占位符防止注入
3、通过bindParam()绑定参数
最后更新于