sql注入

常用的mysql语句

创建mysql用户

#‘host’的值为指定哪些ip可以登录,值为‘%’表示任何人可以登录,值为'localhost'仅允许本机登录
CREATE USER 'username'@'host' IDENTIFIED BY 'password';	  

此处创建用户名为test, 密码为123456

img

读取文件内容

img

写入文件内容

img

注意:如果不能写入文件,先查看mysql的配置文件,若secure_file_priv的值为NULL, 请修改mysql.ini文件

修改mysql.ini 文件,在[mysqld] 下加入secure_file_priv =,随后重启mysql服务

img

修改mysql.ini 文件,在[mysqld] 下加入secure_file_priv =,保存,重启mysql。

时间盲注常用语句

sleep(秒数)

img

if(条件,true,false)

img

length(字符串)

mid(str,首位,个数)

img
img

limit(start, length), 参数start是从0开始的

image-20220825233335489

报错注入常用语句

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.tablesInformation_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编码, 可有效绕过单双引号过滤机制

img

2.参数加密注入

有些url里的参数是加密的,网站服务器在收到url加密过的参数时会对其进行解密,面对这种情况要先知道url参数采用的是什么加密方式, 然后对sql注入语句进行相应的加密

如下图所示,此网站都url参数采用base64编码, 那么我们的sql注入语句也要使用base64编码

img
img

3.宽字节绕过单双引号过滤

源于开发人员设置Mysql连接时的错误配置, mysql若采用gbk的编码格式, 则会将两个字节识别成一个汉字

涉及注入的php函数addslashes() ,其作用是在每个单双引号前添加反斜杠,如下图所示

img

将闭合符号由单(双)引号修改成%df'

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

img

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

img

万能密码注入

介绍

一些后端代码会通过查询返回的行数来判断是否登录成功,若查询返回的是一行或多行, 后端代码会识别成登录成功

此处演示的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'

image-20210521103735280

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假==的整体逻辑为==真==

image-20210521103856650

常用万能密码

PDO技术防御sql注入

调用quote函数

预处理sql语句:

1、通过命名参数防止注入

2、通过问号占位符防止注入

3、通过bindParam()绑定参数

最后更新于