逻辑sql注入

逻辑sql注入

关键词判断

1
2
3
联合注入:unin被过滤
报错注入:and、or、updatexml被过滤
bool注入和time注入:and、or被过滤

打开页面源码,看到

1
<!--MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5-->

由于base32的特征是纯大写+数字,所以进行base32解密,得到有等于号的字母加数字,猜测是base64,进行base64解密,得到

1
select * from user where username = '$name'

可见在username中有注入点,由于=和or被过滤,所以可以使用<>或like来代替=,用0r来代替or,不过也报错

因此,我们可以从后端逻辑出发,一般是:先检索数据。拿出username的键值来进行对比,如果错误,则报错,如果正确,则进行下一步,再拿password的键值与我们输入的password进行比较

不过放在数据库里用于比较的键值都是加密的,加密方式有mysql、mysql5、md5等,我们可以猜想它的工作的代码

1
2
3
4
5
6
7
$data = 检索数据。
if ($data['username'] === 'admin') {
if ($data['password'] === md5($pw)) {
return true;
}
}

因此我们可以使用联合注入来操纵检索数据,一般数据列中的字段都是id,username,password,所以构造payload

1
a' union select 1,admin,输入密码的md5值%23&pw=输入密码