SQL注入之堆叠查询注入学习笔记

SQL注入之堆叠查询注入学习笔记
一、什么是堆叠查询注入堆叠查询注入是SQL注入中比较特殊的一种类型。它的核心逻辑是在原有的SQL语句结束后使用分号;作为分隔符将多条SQL语句拼接在一起执行。 与之前学过的所有注入类型都不同堆叠查询注入的目标不再是“获取数据”而是“执行多条任意SQL语句”。堆叠查询注入的适用场景堆叠查询注入在以下场景中特别有效目标数据库支持多语句执行MySQL的mysqli扩展默认支持PDO默认不支持注入点位于SQL语句的末尾可以闭合后添加新语句攻击者希望执行数据操作增删改查或提权操作目标网站的数据库用户有较高的执行权限堆叠查询注入的核心要素堆叠查询注入需要满足以下几个条件注入点存在且能够正常闭合原有SQL语句数据库驱动支持多语句执行当前数据库用户有执行多条语句的权限攻击者能够获取到新语句执行后的结果或观察到执行效果堆叠查询注入与联合查询注入的本质区别联合查询注入和堆叠查询注入虽然都涉及多条SQL语句但它们的本质完全不同。联合查询注入的 UNION SELECT 是在一条 SELECT 语句内部将两个查询结果合并最终数据库只执行了一条 SELECT 语句。而堆叠查询注入是通过分号将多条完整的SQL语句串联数据库会依次执行每一条语句。两者的攻击目标和实现方式都有根本性的差异。二、堆叠查询注入的基本原理1 . 分号的作用在SQL中分号;是语句结束的标志。在支持多语句执行的数据库中多个以分号分隔的SQL语句可以依次执行。正常SQL语句SELECT*FROMusersWHEREid1堆叠查询注入后的SQL语句SELECT*FROMusersWHEREid1;DROPTABLEusers;当数据库执行这个语句时会先执行 SELECT 查询然后再执行 DROP TABLE 删除表操作。2 .堆叠查询注入的典型Payload查询数据id1;SELECT*FROMadmin插入数据id1;INSERTINTOadmin(username,password)VALUES(hacker,123456)修改数据id1;UPDATEadminSETpassword123456WHEREusernameadmin删除数据id1;DELETEFROMadminWHEREusernameadmin创建表id1;CREATETABLEtest(idINT,nameVARCHAR(100))删除表id1;DROPTABLEtest3 . 堆叠查询注入的信息获取方式堆叠查询注入的一个显著特点是后续语句的执行结果通常不会直接返回到页面上。如果执行的是 SELECT 语句查询结果可能不会显示如果执行的是 INSERT、UPDATE、DELETE、DROP 等操作只能通过观察页面变化或数据库变化来判断是否执行成功。获取执行结果的方法· 观察页面是否出现变化如数据被修改后的显示变化· 观察数据库中的数据是否被修改· 通过报错信息判断语句是否执行成功· 结合其他注入手法如联合查询、报错注入来读取执行结果在某些情况下如果堆叠查询注入配合文件操作可以将查询结果写入服务器上的文件中然后通过访问该文件来获取数据。三、不同数据库对堆叠查询注入的支持情况堆叠查询注入并非在所有数据库中都能使用不同数据库的支持程度差异很大。1 .MySQLMySQL的多语句执行取决于数据库驱动。使用 mysqli 扩展时默认支持多语句执行通过 mysqli_multi_query() 函数而使用 PDO 时默认不支持需要在连接时设置 PDO::MYSQL_ATTR_MULTI_STATEMENTS 为 true 才能启用。在实际的Web应用中如果开发者在代码中使用了 mysqli_multi_query() 或类似的函数并且没有对用户输入进行有效过滤就可能存在堆叠查询注入漏洞。2 .PostgreSQLPostgreSQL原生支持多语句执行使用分号分隔即可。PostgreSQL的堆叠查询注入能力非常强大支持执行系统命令通过 COPY 语句等高级操作。3 .SQL ServerSQL Server同样支持多语句执行。在SQL Server中堆叠查询注入通常与 xp_cmdshell 等扩展存储过程配合使用可以执行操作系统命令危害极大。4 .OracleOracle数据库对堆叠查询注入的支持较为特殊。Oracle默认不支持使用分号分隔多条语句执行但在某些特定条件下如使用PL/SQL块仍然可以实现类似的效果。四、堆叠查询注入的高级利用方式1 .时间盲注与堆叠查询注入的结合当堆叠查询注入无法直接获取数据时可以结合时间盲注技术来判断语句执行情况。id1;SELECTIF(11,SLEEP(5),0)2 .文件操作MySQL在MySQL中如果当前用户拥有 FILE 权限可以通过堆叠查询注入进行文件读写操作。读取服务器文件id1;SELECTLOAD_FILE(/etc/passwd)写入WebShellid1;SELECT?php eval($_POST[cmd]); ?INTOOUTFILE/var/www/html/shell.php3 .提权操作在某些情况下堆叠查询注入可以用来创建具有管理员权限的数据库用户或者修改现有用户的权限。创建新用户id1;CREATEUSERhackerlocalhostIDENTIFIEDBYpassword;GRANTALLPRIVILEGESON*.*TOhackerlocalhost五、堆叠查询注入的防御措施堆叠查询注入的防御思路与其他注入类型有所不同因为它的核心是利用了多语句执行的功能。最根本的防御措施是禁止多语句执行。 在数据库连接配置中不启用多语句执行功能或者直接使用不支持多语句执行的API如PDO默认配置可以从根本上杜绝堆叠查询注入。具体防御方案在PHP的PDO中不设置 PDO::MYSQL_ATTR_MULTI_STATEMENTS 为 true使用默认配置即可防御在Java的JDBC中使用 Statement 时禁用多语句执行或直接使用 PreparedStatement 进行参数化查询使用参数化查询PreparedStatement替代动态拼接SQL语句对用户输入进行严格过滤过滤分号等特殊字符应用最小权限原则数据库连接账号仅授予必要权限避免使用高权限账号

最新新闻

日新闻

周新闻

月新闻