SQL注入流程

SQL注入流程

寻找SQL注入点

目标搜集:

  • 无特定目标: inurl:php?id=
  • 有特定目标: inurl:php?id= site:target.com
  • 工具爬取:spider,对搜索引擎和目标网站的链接进行爬取

注入识别

手工简单识别:
and 1=1
and 1=2
and '1'='1
and '1'='2
and 1 like 1
and 1 like 2
工具识别:
sqlmap -m filename (filename中保存检测目标)
sqlmap --crawl (sqlmap对目标网站进行爬取,然后依次进行测试)
高级识别:

  • 扩展识别广度与深度
    sqlmap --level 增加测试级别(1-5级),对header中相关参数也进行测试
    sqlmap -r filename (filename中为网站请求数据)
  • 利用工具提高识别效率
    burpsuite+sqlmap
    Burpsuite拦截所有浏览器访问提交的数据
    burpsuite扩展插件,直接调用sqlmap进行测试

TIPS:

  • 可以在参数后加入“*”确定要测试的参数
  • 可能出现注入的点:新闻、登录、搜索、留言 …
  • 站在开发的角度去寻找

代码审计

  • 搜索关键代码和函数(例如select、get、post等)
  • 梳理业务流程

SQL注入流程

信息搜集

  • 数据库类型(根据报错信息、特有语句)
  • 数据库版本
  • 数据库用户
  • 判断数据库权限

数据获取

  • 数据库信息(当前数据库、所有库)
  • 获取表信息
  • 获取列信息
  • 获取数据

提权

  • 根据数据库权限执行系统命令-直接提权
  • 根据数据库权限读文件(读数据库配置文件尝试远程连接, 读系统配置文件收集信息)
  • 根据数据库权限写文件(写webshell传到网站目录)

判断数据库方法

常见数据库

关系型数据库:Oracle、DB2、MySql

非关系型数据库:NoSql、Cloudant

基于特定函数的判断

len()和length()
在mssql和mysql以及db2中,返回长度值是调用len()函数,
在oracle和INFORMIX则是通过length()来返回长度值
当使用and len(‘a’)=1的时候,返回正常页面时,可以推断当前的数据库类型可能是mssql,或mysql,或是db2。反之则可能会是oracle和informix。

@@version和version
在mysql内,可以用@@version或是version()来返回当前的版本信息。但无法判断是mysql还是mssql时,可以用version()函数来构造判断。version()>1 返回与@@version>1 相同页面时,则可能是mysql。如果出现提示version()错误时,则可能是mssql。

substring和substr

在mssql中可以调用substring。oracle则只可调用substr

基于辅助的符号判断

“/*”是MySQL中的注释符,返回错误说明该注入点不是MySQL,继续提交如下查询字符:

“–”是Oracle和MSSQL支持的注释符,如果返回正常,则说明为这两种数据库类型之一。继续提交如下查询字符:
“;”是子句查询标识符,Oracle不支持多行查询,因此如果返回错误,则说明很可能是Oracle数据库。
在注入点后加(必须为注入点);–(一个分号,两个横线),例如:http://xxxx/article/as.asp?id=1;--
如果返回正常的话,说明数据库是MSSQL。在MSSQL数据库中;和–都是存在的,;用来分离两个语句,而–就是注释符,它后面语句都不执行。如果返回错误,基本可以肯定是ACCESS数据库了。

and exists (select count(*) from sysobjects)
and exists (select count(*) from msysobjects)
如果第一条返回正常,就是MSSQL数据库,如果两条都不正常,那就是ACCESS数据库了。第一句意思是查询sysobjects表里记录数大于,返回正常的,说明大于0且存在sysobjects这个表,因为这个表只有MSSQL数据库才有,所以可以判断为MSSQL数据库。返回错误则表示不是。第二句提交是不会返回正常页面的,就算是ACCESS数据库也不会返回正常。因为默认情况下我们没有权限查询这个表里的数据。WEB会提示我们“记录无法读取;
'msysobjects’没有读取权限”,如果返回的是这个错误信息的话,那就证明是ACCESS数据库了

以上参数都是int的时候,如果是字符型的话首先在参数后面加上单引号,然后再在查询语句后加上;–

基于显示错误信息判断

在注入点后直接加上单引号,根据服务器的报错信息来判断数据库。错误提示Microsoft JET Database Engine 错误 ‘80040e14’,说明是通过JET引擎连接数据库,则表明数据库为ACCESS数据库,如果是ODBC的话则说明是MSSQL数据库。

参考文章

网易Web安全进阶
https://www.cnblogs.com/Fluorescence-tjy/p/10400588.html

发布了25 篇原创文章 · 获赞 24 · 访问量 7935

猜你喜欢

转载自blog.csdn.net/qq_40023447/article/details/101994394