十有八九是注入,不过测试引号和转义符并没发现什么,因而跑了下密码字典,居然发现网页提示 sql injection detected! ,而后发现原来是密码中存在or关键字php
测试了username处发现未拦截关键字,那注入点应该只存在于password,那么应该就是username填admin,password处构造SQL语句条件为真便可html
试了好久才发现原来是考宽字节注入,payload以下mysql
username=admin&password=%df'<>1#sql
后台语句则会是less
SELECT * FROM users WHERE username='admin' AND password='?'<>1
password='?' 为假即0,0<>1为真,因此整条语句为真函数
SQL约束攻击测试
注册一个帐号编码
admin xxx (中间多几个空格)spa
123456789code
而后以admin:123456789登陆
一开始瞎尝试毫无头绪,后才发现有源码泄露
http://chall.tasteless.eu/level12/lucky.php~
代码为
<?php $k=$_GET['emit']; $a=substr(sprintf("%8x%05x\n",floor($k),($k-floor($k))*1000000),0,-3); $b=substr(uniqid(),0,-2); if($a==$b){ print "WTF?! YOU REALLY DID IT <3<br /> flag is: t1m1ng4tt4ck"; } else { print "VAR a is ".$a."<br />"; print "VAR b is ".$b."<br />"; } ?>
...
没错flag就在源码里,t1m1ng4tt4ck
不过仍是要研究一下这题的正常解法
$a=substr(sprintf("%8x%05x\n",floor($k),($k-floor($k))*1000000),0,-3);
$a前8位是floor($k),后5位是($k-floor($k))*1000000),即后5位取决于小数部分,而后被substr,只取前11位
$b=substr(uniqid(),0,-2);
uniqid() 函数基于以微秒计的当前时间,生成一个惟一的 ID
$b的11位都取决于当前时间
因此就要构造一个比当前时间大一点的payload,而后用burp不断发包,直到恰好撞上
待更
待更
待更
字符集的问题
注册的时候admin后面加上\xC2
登陆以admin便可
http://chall.tasteless.eu/level20/index.php?view=flag as Quality from level20_flag join level20`
实验室的小伙伴试出来的,我以前有想过join,可是题目ban了注释符,就一直没想到绕过方法,至于为何这里反引号能当注释用,目前仍是不清楚,正在研究。。。
更:mysql中起别名用as,但as能够省略,而在能够起别名的地方,用上反引号,其后的内容都会做为别名