实验吧[WEB]——程序逻辑问题
拿到题 通过查看网页源代码发现index.txt
通过index.txt我们获得了后端的源代码
我们可以通过我画出来的这两个重要的信息得知 第一个sql查询语句没有任何过滤说明存在SQL注入漏洞。
第二个我画出的代码就是我们要获得flag的核心
if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
echo "<p>Logged in! Key:************** </p>";
}
这块代码的意思是 首先从数据库中提取出pw 然后逻辑与 与右边的(!strcasecmp($pass, $row[pw])) 两条语句都为真才会打印出flag
我们先看右边的这块strcasecmp是什么
strcasecmp() 函数比较两个字符串。
提示:strcasecmp() 函数是二进制安全的,且不区分大小写。
语法:
strcasecmp(string1,string2)
参数 |
描述 |
string1 |
必需。规定要比较的第一个字符串。 |
string2 |
必需。规定要比较的第二个字符串。 |
返回值: |
该函数返回:
|
所以这段(!strcasecmp($pass, $row[pw])) 是要从数据库中提取出 与我们用户输入的作比较且都是经过cmd5加密的数据 可以看源代码第16行 作比较必须相等才为0 然后!取反 这段代码的运行结果返回1 与左边的($row[pw])它是有数据就返回1 所以两者条件必须都为1或者才能打印出flag 可是数据库里面的值我们不知道 所以我们想办法构造注入语法让他满足条件。
‘
我们可以先看一个mysql查询的特性
这是我们admin表中的仅有数据 我们现在想查一个密码为xiaohua经过md5加密的
ee755bdd4adb8ac6270ef476fefab245这个是xiaohua的cmd5密文 可是数据库里面没有这个怎么办我们来构造
我们根据它的特性构造一个联合查询 这样第一条语句查询dsfd 这个用户查不到 然后第二个根据特性会返回这个结果到password字段下
select password from admin where username="dsfd" union select" ee755bdd4adb8ac6270ef476fefab245";
成功返回xiaohua md5的密文
所以我们回到我们的题
我们只关注右边红线这部分,从数据库提取不存在的值我们可以通过下方sql语句构造得到
然后$pass这块我们要输入和加密md5一样的值也就是xiaohua 这样一来 他们的条件就成立了 就能获得flag了
下来就要用到我们的注入手法
成功获得flag
也可以这样构造 方便
username:username' union select md5(1)#
password:1
引用: https://blog.csdn.net/dongyanwen6036/article/details/77768345
` https://blog.csdn.net/he_and/article/details/77618429
后记 其实这个题很简单就是对SQL语法技巧不太熟。忍不住看了WP
要继续加油啊!