成长的痛苦,远比后悔的痛苦好
后台登录
1.查看源码,发现以下内容
1 |
|
2.刚开始想着直接万能语句来着,后来发现不行。mysql中的运算优先级为:not>and>or 万能语句绕不过的,这题主要考md5生成摘要构成语句注入。
1 |
|
运行结果为:
3.由结果可知,语句变为SELECT * FROM admin WHERE pass=' 'or '6<*****>'
其中<*****>
不必管,条件即为真,所以可绕过。相当于select * from users where username='admin' and password=''or'6fsfdsgfdsgsdg';
恒为真,如图
加了料的报错注入
1.查看源码
1 | // tips:post username and password... |
2.试了不少,还是没头绪,看writeup,发现又是一种新方式。实验吧的题很强啊(哭)
3.有两种解法
方法一:HPF(http parameter fragment)
主要是用/**/构造语句注入,如下。
1 | 看版本 |
方法二:exp()报错注入
因为没有过滤exp()函数,所以可以利用。关于exp()溢出报错注入
认真一点
1.此题有很多坑,总结的话,最应该注意的还是注意每一个细节(有三种反馈信息)之前没管它,模糊测试后,试到怀疑人生。
You are in ................
正常输入且成功You are not in ...............
输入后不成功(在后台删去某些字符串)Sql injection detected!
检测到并且过滤掉的字符串
2.这个肯定是要盲注的,下面是代码。
这里有一个需要注意的,请关掉代码格式自动调整,因为会自动加上空格导致跑不出来。
3.这个题一个很坑的地方是有的字符串它直接去掉,然后显示的是You are not in ...............
所以构造时,需要双写绕过,比如or
要写为oorr
。
1 | import requests |
你真的会php吗
1.看到题目,八成是代码审计的题,看来又得慢慢查了。产看源码无果后,再看看响应头,发现有个txt文件。
2.访问得到源码(下面的源码是自己添加注释后的,方便观看)
1 |
|
3.可以看到,此题有点变态,在这再进一步描述一下几个函数。
(1)intval()函数:
用于获取变量的整数值。语法为:int intval ( mixed $var [, int $base = 10 ] )
intval()
函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。intval()
不能用于 object,否则会产生E_NOTICE
错误并返回 1。成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。
- 最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是
-2147483648
到2147483647
。 - 64 位系统上,最大带符号的 integer 值是 9223372036854775807。
- 字符串有可能返回 0,虽然取决于字符串最左侧的字符。
(2)其他函数:其实大部分函数从字面上都可以看出其功能,主要是不清楚其是否存在可用的漏洞。这里主要利用了intval()
函数存在的漏洞。
4.解题方法
方法一:利用intval溢出
32位机最大值2^31-1=2147483647
,反转后为7463847412
,但是已经溢出,所以会自动变成2147483647
,根据源码分析可知,number=2147483647%20
可行。
方法二:
第二个思想可以直接使用-0%20
,就不多说了,根据源码走一遍,加深理解。
注:加上%20是因为输入不可为数值,而且intval()
会自动忽略。
5.任意提交上面一个,即可得出flag。
###