(1)注入原理

通过利用一些查询语句的漏洞,将sql语句传递到服务器解析并执行。它是一种注入攻击,可以执行恶意的sql语句。它通过将任意sql代码插入数据库查询,使攻击者能够完全控制web应用程序后面的数据库服务器。攻击者可以使用sql注入漏洞绕过应用程序的安全措施,可以绕过网页或web 应用程序的身份验证和授权,并检索整个sql数据库的内容,还可以使用sql注入来添加,修改和删除数据库中的记录。

(2)分类

1)联合查询

使用$_REQUEST直接接收id参数,且没有进行过滤,且可以接收cookie get post这些传递方法。当传入1 时,页面正常返回用户信息。

mysqli_query() 函数执行某个针对数据库的查询。

mysqli_query(connection,query,resultmode);

connection 必需。规定要使用的 MySQL 连接。
query 必需,规定查询字符串。
resultmode

可选。一个常量。可以是下列值中的任意一个:

  • MYSQLI_USE_RESULT(如果需要检索大量数据,请使用这个)
  • MYSQLI_STORE_RESULT(默认)

mysqli_fetch_assoc() 函数从结果集中取得一行作为关联数组。

该函数返回的字段名是区分大小写的。

mysqli_fetch_assoc(result);

result 必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。

is_object() 函数用于检测变量是否是一个对象。

PHP 版本要求: PHP 4, PHP 5, PHP 7

bool is_object ( mixed $var )
  • $var:要检测的变量。
  • 返回值。如果指定变量为对象,则返回 TRUE,否则返回 FALSE。

2)布尔盲注

接收id的值,直接带入查询,如果存在即返回语句

mysqli_num_rows() 函数返回结果集中行的数量。mysqli_num_rows(result);

result

必需。规定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识符。

返回值: 返回结果集中行的数量。
PHP 版本: 5+

is_null() 函数用于检测变量是否为 NULL。

bool is_null ( mixed $var )      $var:要检测的变量。

如果指定变量为 NULL,则返回 TRUE,否则返回 FALSE。

3)报错注入

如果语法错误,mysqli_error()、mysql_connect_error()会将语法错误信息显示到页面上

mysqli_error() 函数返回最近调用函数的最后一个错误描述。mysqli_error(connection);

connection 必需。规定要使用的 MySQL 连接。

mysqli_connect_error() 函数返回上一次连接错误的错误描述。mysqli_connect_error();

返回值: 返回一个描述错误的字符串。如果没有错误发生则返回 NULL。
PHP 版本: 5+

4)时间注入

获取id带入数据库进行查询,是否存在记录页面返回一样。

mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有

返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。

mysql_fetch_array(data,array_type)
data 可选。规定要使用的数据指针。该数据指针是 mysql_query() 函数产生的结果。
array_type

可选。规定返回哪种结果。可能的值:

  • MYSQL_ASSOC - 关联数组
  • MYSQL_NUM - 数字数组
  • MYSQL_BOTH - 默认。同时产生关联和数字数组

5)堆叠注入

程序获取get参数的id,使用mysqli的方式进行数据查询,在执行语句时候使用mysqli_multi_query函数处理sql语句,导致存在堆叠注入

mysqli_connect_errno() 函数返回上一次连接错误的错误代码。mysqli_connect_errno();

返回值: 返回错误代码值,如果没有错误发生则返回 0。
PHP 版本: 5+

mysqli_select_db() 函数用于更改连接的默认数据库。mysqli_select_db(connection,dbname);

connection 必需。规定要使用的 MySQL 连接。
dbname 必需,规定要使用的默认数据库。

mysqli_multi_query() 函数执行一个或多个针对数据库的查询。多个查询用分号进行分隔。

mysqli_multi_query(connection,query);

connection 必需。规定要使用的 MySQL 连接。
query 必需。规定一个或多个查询,用分号进行分隔。

6)二次注入

mysql_escape_string函数会将特殊字符进行过滤,如'经过转义成了\',然后用insert into存入数据库中

在login.php查看源码,登录获取用mysql_escape_string对输入的参数进行转义,转义后在数据库中找到指定的账号和密码,再传入session

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。

下列字符受影响:

  • \x00
  • \n
  • \r
  • \
  • '
  • "
  • \x1a

如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。

mysql_real_escape_string(string,connection)
string 必需。规定要转义的字符串。
connection 可选。规定 MySQL 连接。如果未规定,则使用上一个连接。

看pass_change.php源码,$_SESSION['username']复制给$username无过滤带入UPDATE语句中造成注入。整个流程时注册用户,更改密码时触发注入。二次注入隐蔽,通常发送在更改,需要二次带入数据时提交的功能里。

mysql_affected_rows() 函数返回前一次 MySQL 操作所影响的记录行数。

mysql_affected_rows(link_identifier)
link_identifier 必需。MySQL 的连接标识符。如果没有指定,默认使用最后被 mysql_connect() 打开的连接。如果没有找到该连接,函数会尝试调用 mysql_connect() 建立连接并使用它。如果发生意外,没有找到连接或无法建立连接,系统发出 E_WARNING 级别的警告信息。

7)宽字节注入

首先check_addlashes是将特殊字符进行过滤,将'变成\'mysql_query设置数据库的编码为gbk,将id参数传入到sql中带入查询。传入%df%27即可逃逸gbk,故存在宽字节注入。

在每个双引号(")前添加反斜杠:

addslashes() 函数返回在预定义字符之前添加反斜杠的字符串。

预定义字符是:

  • 单引号(')
  • 双引号(")
  • 反斜杠(\)
  • NULL

提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备字符串。

默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

addslashes(string)
string 必需。规定要转义的字符串。

8)cookie注入

判断是否提交submit,如果存在,$cookie=$_COOKIE['uname'];获取值保存到$cookie中,再拼接到sql带入查询,造成注入。

sql注入php代码审计1相关推荐

  1. [网络安全提高篇] 一〇九.津门杯CTF的Web Write-Up万字详解(SSRF、文件上传、SQL注入、代码审计、中国蚁剑)

    这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步.这篇文章主要介绍5月9日参加津门杯CTF题目知识,包括power_cut.hate_ ...

  2. 关于espcms的sql注入漏洞代码审计复现

    最近在看Seay大大的代码审计一书,边看边做一些代码审计的复现. 在讲代码审计思路时,大大用espcms举例挖掘了个sql注入漏洞,现在准备复现一下. 此案例主要是根据关键字回溯,然后得到漏洞. 使用 ...

  3. 堕落小白的前台sql注入cms代码审计

    大家好我是一只没有灵魂小白鼠每日每夜都为了拿到那一点src的奖金日夜操劳.有一天我翻了翻日历算了一卦,好家伙今天是个挖洞的好日子.我打开电脑略微思考了一下人生我是谁?我在哪?我要干什么?好家伙很快哈一 ...

  4. /plus/recommend.php sql注入漏洞,代码审计:ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法 | Seay 渗透 编程 代码审计 网络安全博客...

    显示不全请点击全屏阅读 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商 ...

  5. espcms5.7.13 sql注入漏洞复现

    espcms5.7.13 sql注入漏洞复现 作者: admin 时间: 2021-06-28 分类: 漏洞复现 使用代码审计工具自动审计,找到select语句,双击进入/adminsoft/cont ...

  6. 【网络安全】php代码审计-sql注入进阶篇

    前言 经过上一篇文章我们已经大概的了解sql注入去怎样审计了.但是在实际的网站中和用户的输入输出接口不可能想那样没有防御措施的.现在各大网站都在使用waf对网站或者APP的业务流量进行恶意特征识别及防 ...

  7. 代码审计之SQL注入:BlueCMSv1.6 sp1

    这是一篇纪录关于BlueCMSv1.6 sp1两个SQL注入的审计过程,原文来自代码审计之SQL注入:BlueCMSv1.6 sp1 ,主要纪录一下个人在参考博文复现这两个漏洞经过. href=&qu ...

  8. 常见的Java审计代码函数关键字_转载:Java代码审计汇总系列(一)——SQL注入

    原文链接:https://cloud.tencent.com/developer/article/1534109 一.代码审计 相比黑盒渗透的漏洞挖掘方式,代码审计具有更高的可靠性和针对性,更多的是依 ...

  9. 代码审计中的SQL注入

    0x00 背景 SQL注入是一种常见Web漏洞,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.本文以代码审计的形式研 ...

最新文章

  1. AI Debate2 | 李飞飞提「AI北极星」,卡尼曼指「系统 1」理解有误
  2. Java 7 并发编程指南
  3. Python3 系列之 可变参数和关键字参数
  4. dsc linux 软件安装_linux – 安装dsc21时出错:“dsc21:取决于:cassandra(= 2.1.8),但要安装2.2.0”...
  5. WSUS 转发邮件中继到Office365
  6. python2.7+opencv3.1人脸识别
  7. (软件工程复习核心重点)第七章软件维护习题
  8. java获取method,2.5 反射——Class对象功能_获取Method
  9. OpenCV防止数据溢出saturate_cast
  10. C# winform 跨线程修改界面
  11. 破解Access(*.mdb)目前所有版本的密码
  12. FASS分布式全闪存储技术白皮书
  13. 调查称82%网友面对安全问题无从下手
  14. office2003注册序列号CAB文件丢失…
  15. Win10打开“此电脑”读绿条,显示“正在处理”
  16. IntelliJ IDEA 的 Code Coverage 测试
  17. CTF-misc(解题思路/做题经验)
  18. 什么叫原子操作?使用这个东西有什么目的?
  19. 【读书笔记】《结构思考力》——李忠秋
  20. Hi3516A 烧录内核后无法ping通网关和自己

热门文章

  1. ehcache java清除缓存数据,EhCache缓存使用
  2. 滴滴的数据分析原来是这样做的!
  3. 昆仑mcp文件是什么版本_都说昆仑健康保多倍版MAX好,为什么我却不建议你选?...
  4. wsappx关不掉_win10系统下wsappx.exe进程占用内存大能关闭吗
  5. 分享我的电子藏书:数据库系列
  6. 主板螺丝是机箱配还是主板配_忽略这个就傻了 DIY装机不能小瞧的细节
  7. 7-6 哈利·波特的考试 (15 分)
  8. 大地坐标系(WGS84)转空间直角坐标系(笛卡尔坐标系XYZ)
  9. 交流伺服电机的刚性浅析
  10. ChatGPT的主要应用场景例子