Changeset 118

Show
Ignore:
Timestamp:
04/11/06 21:32:56 (3 years ago)
Author:
michiel
Message:

Fix last sql-injections we can find.
Fixed some XSS attacks in the backend.

Fixes #54, Re #55

Location:
trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/admin/index.php

    r115 r118  
    381381function show_cats() { 
    382382        global $db; 
    383         $res =& $db->query("SELECT * FROM categories"); 
     383        $res =& $db->query("SELECT * FROM categories ORDER BY name"); 
    384384        if (PEAR::isError($res)) { 
    385385                die($res->getMessage()); 
     
    529529                        <div class="log_head"> 
    530530                                <span class="log_subject"> 
    531                                         &nbsp;&nbsp;<a href="?action=edit_acro&amp;id=<?=$row["id"]?>"><?=$row["acronym"]?></a>&nbsp;&nbsp; 
     531                                        &nbsp;&nbsp;<a href="?action=edit_acro&amp;id=<?=$row["id"]?>"><?=stripslashes($row["acronym"])?></a>&nbsp;&nbsp; 
    532532                                </span> 
    533533                        </div> 
    534534                        <div class="log_body"> 
    535535                                <span class="log_contents"> 
    536                                         <?=$row["description"]?> 
     536                                        <?=stripslashes($row["description"])?> 
    537537                                </span> 
    538538                        </div> 
     
    554554                $cat["description"] = "Category description"; 
    555555        } else { 
    556                 $res =& $db->query("SELECT * FROM acronyms WHERE id=$id"); 
     556                $res =& $db->query(sprintf("SELECT * FROM acronyms WHERE id = %d", $id)); 
    557557                if (PEAR::isError($res)) { 
    558558                        die($res->getMessage()); 
     
    567567                <div class="log_head"> 
    568568                        <span class="log_subject"> 
    569                                 &nbsp;&nbsp;<input type="text" name="acro[acronym]" value="<?=$acro["acronym"]?>" />&nbsp;&nbsp; 
     569                                &nbsp;&nbsp;<input type="text" name="acro[acronym]" value="<?=stripslashes($acro["acronym"])?>" />&nbsp;&nbsp; 
    570570                        </span> 
    571571                </div> 
    572572                <div class="log_body"> 
    573573                        <span class="log_contents"> 
    574                                 <input type="text" name="acro[description]" value="<?=$acro["description"]?>" style="width: 500px;" /> 
     574                                <input type="text" name="acro[description]" value="<?=stripslashes($acro["description"])?>" style="width: 500px;" /> 
    575575                        </span> 
    576576                        <input type="submit" value="save" /> 
     
    594594        global $db; 
    595595        if ($acro["id"]) { 
    596                 $query  = "UPDATE acronyms SET "; 
    597                 $query .= "acronym='".$acro["acronym"]."'"; 
    598                 $query .= ", description='".$acro["description"]."'"; 
    599                 $query .= " WHERE id=".$acro["id"]; 
    600         } else { 
    601                 $query  = "INSERT INTO acronyms (acronym, description) VALUES ("; 
    602                 $query .= "'".$acro["acronym"]."'"; 
    603                 $query .= ", '".$acro["description"]."'"; 
    604                 $query .= ")"; 
     596                $query = sprintf("UPDATE acronyms SET acronym = '%s', description = '%s' WHERE id = %d", 
     597                        preg_quote(strip_tags($acro["acronym"]), "'"), 
     598                        preg_quote(_strip_tags($acro["description"]), "'"), 
     599                        $acro["id"] 
     600                ); 
     601        } else { 
     602                $query = sprintf("INSERT INTO acronyms (acronym, description) VALUES ('%s', '%s')", 
     603                        preg_quote(strip_tags($acro["acronym"]), "'"), 
     604                        preg_quote(_strip_tags($acro["description"]), "'") 
     605                ); 
    605606        } 
    606607        $res =& $db->query($query); 
     
    616617function delete_acro($id) { 
    617618        global $db; 
    618         $query = "DELETE FROM acronyms WHERE id=$id"; 
     619        $query = sprintf("DELETE FROM acronyms WHERE id = %d", $id); 
    619620        $res =& $db->query($query); 
    620621        if (PEAR::isError($res)) { 
     
    642643                                        &nbsp;&nbsp; 
    643644                                        <a href="?action=edit_author&amp;id=<?=$row["id"]?>"> 
    644                                         <?=$row["fullname"]?> 
     645                                        <?=stripslashes($row["fullname"])?> 
    645646                                        <? if ($row["active"]) { ?> 
    646647                                                (active) 
     
    650651                                        </a>&nbsp;&nbsp; 
    651652                                        <span class="log_cat"> 
    652                                                 loginname: <?=$row["login"]?> 
     653                                                loginname: <?=stripslashes($row["login"])?> 
    653654                                        </span> 
    654655                                </span> 
     
    674675                $author["active"]   = 1; 
    675676        } else { 
    676                 $res =& $db->query("SELECT * FROM authors WHERE id=$authorid"); 
     677                $res =& $db->query(sprintf("SELECT * FROM authors WHERE id = %d", $authorid)); 
    677678                if (PEAR::isError($res)) { 
    678679                        die($res->getMessage()); 
     
    692693                        <span class="log_subject"> 
    693694                                <? if ($authorid) { ?> 
    694                                         &nbsp;&nbsp;<?=$author["login"]?>&nbsp;&nbsp; 
     695                                        &nbsp;&nbsp;<?=stripslashes($author["login"])?>&nbsp;&nbsp; 
    695696                                <? } else { ?> 
    696                                         &nbsp;&nbsp;login: <input type="text" name="author[login]" value="<?=$author["login"]?>" /> 
     697                                        &nbsp;&nbsp;login: <input type="text" name="author[login]" value="<?=stripslashes($author["login"])?>" /> 
    697698                                <? } ?> 
    698699                        </span> 
     
    708709                                </tr><tr> 
    709710                                        <td align="right">email:</td> 
    710                                         <td><input type="text" name="author[email]" value="<?=$author["email"]?>" /></td> 
     711                                        <td><input type="text" name="author[email]" value="<?=stripslashes($author["email"])?>" /></td> 
    711712                                </tr><tr> 
    712713                                        <td align="right">website:</td> 
    713                                         <td><input type="text" name="author[website]" value="<?=$author["website"]?>" /></td> 
     714                                        <td><input type="text" name="author[website]" value="<?=stripslashes($author["website"])?>" /></td> 
    714715                                </tr><tr> 
    715716                                        <td align="right">full name: </td> 
    716                                         <td><input type="text" name="author[fullname]" value="<?=$author["fullname"]?>" /></td> 
     717                                        <td><input type="text" name="author[fullname]" value="<?=stripslashes($author["fullname"])?>" /></td> 
    717718                                </tr></table> 
    718719                        </span> 
     
    753754        if (!$error) { 
    754755                if ($author["id"]) { 
    755                         $query  = "UPDATE authors SET "; 
    756                         $query .= "\"fullname\"='".$author["fullname"]."'"; 
    757                         $query .= ", \"email\"='".$author["email"]."'"; 
    758                         $query .= ", \"website\"='".$author["website"]."'"; 
    759                         $query .= ", active = ".(int)$author["active"]; 
     756                        $query = sprintf("UPDATE authors SET fullname = '%s', email = '%s', website = '%s', active = %d", 
     757                                preg_quote(strip_tags($author["fullname"]), "'"), 
     758                                preg_quote(strip_tags($author["email"]), "'"), 
     759                                preg_quote(strip_tags($author["website"]), "'"), 
     760                                $author["active"] 
     761                        ); 
    760762                        if (trim($author["password"])) { 
    761                                 $query .= ", password='".trim($author["password"])."'"; 
     763                                $query .= sprintf(", password = '%s'", trim(preg_quote(strip_tags($author["password"]), "'"))); 
    762764                        } 
    763                         $query .= " WHERE id=".$author["id"]; 
     765                        $query .= sprintf(" WHERE id = %d", $author["id"]); 
    764766                } else { 
    765                         if (trim($author["password"])) { 
    766                                 $query = "INSERT INTO authors (\"password\", \"fullname\", \"email\", \"website\", \"login\", active) VALUES ('".trim($author["password"])."', "; 
    767                         } else { 
    768                                 $query  = "INSERT INTO authors (\"fullname\", \"email\", \"website\", \"login\", active) VALUES ("; 
    769                         } 
    770                         $query .= "'".$author["fullname"]."'"; 
    771                         $query .= ", '".$author["email"]."'"; 
    772                         $query .= ", '".$author["website"]."'"; 
    773                         $query .= ", '".$author["login"]."'"; 
    774                         $query .= ", ".(int)$author["active"]; 
    775                         $query .= ")"; 
     767                        $query = sprintf("INSERT INTO authors (password, fullname, email, website, login, active) VALUES ('%s', '%s', '%s', '%s', '%s', %d)", 
     768                                preg_quote(strip_tags(trim($author["password"])), "'"), 
     769                                preg_quote(strip_tags($author["fullname"]), "'"), 
     770                                preg_quote(strip_tags($author["email"]), "'"), 
     771                                preg_quote(strip_tags($author["website"]), "'"), 
     772                                preg_quote(strip_tags($author["login"]), "'"), 
     773                                $author["active"] 
     774                        ); 
    776775                } 
    777776                $res =& $db->query($query); 
     
    810809                                <table border="0" cellspacing="0" cellpadding="0"><tr> 
    811810                                        <td style="vertical-align: top;">blog title</td> 
    812                                         <td><input type="text" style="width: 200px;" name="settings[blogtitle]" value="<?=$settings["blogtitle"]?>" /></td> 
     811                                        <td><input type="text" style="width: 200px;" name="settings[blogtitle]" value="<?=stripslashes($settings["blogtitle"])?>" /></td> 
    813812                                </tr><tr> 
    814813                                        <td style="vertical-align: top;">blog/meta description:</td> 
    815                                         <td><textarea name="settings[blogdescription]" style="width: 200px; height: 100px;"><?=$settings["blogdescription"]?></textarea></td> 
     814                                        <td><textarea name="settings[blogdescription]" style="width: 200px; height: 100px;"><?=stripslashes($settings["blogdescription"])?></textarea></td> 
    816815                                </tr><tr> 
    817816                                        <td style="vertical-align: top;">meta keywords</td> 
    818817                                        <td> 
    819                                                 <textarea name="settings[blogkeywords]" style="width: 200px; height: 100px;"><?=$settings["blogkeywords"]?></textarea> 
     818                                                <textarea name="settings[blogkeywords]" style="width: 200px; height: 100px;"><?=stripslashes($settings["blogkeywords"])?></textarea> 
    820819                                        </td> 
    821820                                </tr><tr> 
     
    860859        /* construct queries to sync database with userinput */ 
    861860        foreach ($settings as $key=>$val) { 
    862                 if (array_key_exists($key, $settings_db)) { 
     861                if (array_key_exists(preg_quote(_strip_tags($key), "'"), $settings_db)) { 
    863862                        //setting was there, we need to UPDATE it 
    864                         $queries[] = sprintf("UPDATE settings SET settingvalue='%s' WHERE settingname='%s'", $val, $key); 
     863                        $queries[] = sprintf("UPDATE settings SET settingvalue = '%s' WHERE settingname = '%s'", preg_quote(_strip_tags($val), "'"), preg_quote(strip_tags($key), "'")); 
    865864                } else { 
    866865                        //setting was not there, we need to INSERT it 
    867                         $queries[] = sprintf("INSERT INTO settings (settingname, settingvalue) VALUES ('%s','%s')", $key, $val); 
     866                        $queries[] = sprintf("INSERT INTO settings (settingname, settingvalue) VALUES ('%s','%s')", preg_quote(strip_tags($key), "'"), preg_quote(_strip_tags($val), "'")); 
    868867                } 
    869868        } 
     
    907906                                        <table border="0" cellspacing="1" cellpadding="0"><tr> 
    908907                                                <td>name</td> 
    909                                                 <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][linktitle]" value="<?=$row["linktitle"]?>" /></td> 
     908                                                <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][linktitle]" value="<?=stripslashes($row["linktitle"])?>" /></td> 
    910909                                        </tr><tr> 
    911910                                                <td>link</td> 
    912                                                 <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][url]" value="<?=$row["url"]?>" /></td> 
     911                                                <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][url]" value="<?=stripslashes($row["url"])?>" /></td> 
    913912                                        </tr><tr> 
    914913                                                <td>image</td> 
    915                                                 <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][image]" value="<?=$row["image"]?>" /></td> 
     914                                                <td><input style="width: 300px;" type="text" name="link[<?=$row["id"]?>][image]" value="<?=stripslashes($row["image"])?>" /></td> 
    916915                                        </tr><tr> 
    917916                                                <td>pos</td> 
    918917                                                <td> 
    919                                                         <input style="width: 30px;" type="text" name="link[<?=$row["id"]?>][sortorder]" value="<?=$row["sortorder"]?>" /> 
     918                                                        <input style="width: 30px;" type="text" name="link[<?=$row["id"]?>][sortorder]" value="<?=(int)$row["sortorder"]?>" /> 
    920919                                                        <input type="button" name="del" value="del" onclick="document.getElementById('state_<?=$row["id"]?>').value='delete'; document.getElementById('settingsform').submit();"> 
    921920                                                </td> 
     
    963962                                if (strlen(trim($v["linktitle"])) && strlen(trim($v["url"]))) { 
    964963                                        $sql  = "INSERT INTO menulinks (url, linktitle, image, sortorder) VALUES "; 
    965                                         $sql .= sprintf("('%s', '%s', '%s', %d)", $v["url"], $v["linktitle"], $v["image"], $v["sortorder"]); 
     964                                        $sql .= sprintf("('%s', '%s', '%s', %d)", 
     965                                                preg_quote(strip_tags($v["url"]), "'"), 
     966                                                preg_quote(strip_tags($v["linktitle"]), "'"), 
     967                                                preg_quote(strip_tags($v["image"]), "'"), 
     968                                                $v["sortorder"] 
     969                                        ); 
    966970                                        $res = $db->query($sql); 
    967971                                } 
     
    969973                                /* from db. this can be either be marked as delete or save */ 
    970974                                if ($v["state"] == "delete") { 
    971                                         $sql = sprintf("DELETE FROM menulinks WHERE id=%d", $k); 
     975                                        $sql = sprintf("DELETE FROM menulinks WHERE id = %d", $k); 
    972976                                        $res = $db->query($sql); 
    973977                                } elseif ($v["state"] == "save") { 
    974978                                        $sql  = "UPDATE menulinks SET "; 
    975                                         $sql .= sprintf("url='%s'", $v["url"]); 
    976                                         $sql .= sprintf(", linktitle='%s'", $v["linktitle"]); 
    977                                         $sql .= sprintf(", image='%s'", $v["image"]); 
    978                                         $sql .= sprintf(", sortorder=%d", $v["sortorder"]); 
    979                                         $sql .= sprintf(" WHERE id=%d", $k); 
     979                                        $sql .= sprintf("url = '%s'", preg_quote(strip_tags($v["url"]), "'")); 
     980                                        $sql .= sprintf(", linktitle = '%s'", preg_quote(strip_tags($v["linktitle"]), "'")); 
     981                                        $sql .= sprintf(", image = '%s'", preg_quote(strip_tags($v["image"]), "'")); 
     982                                        $sql .= sprintf(", sortorder = %d", $v["sortorder"]); 
     983                                        $sql .= sprintf(" WHERE id = %d", $k); 
    980984                                        $res = $db->query($sql); 
    981985                                } 
     
    991995function show_comments($options) { 
    992996        global $db; 
    993         if (!$options["top"]) { $options["top"] = 0; } else { $options["top"] = (int)$options["top"]; } 
     997        if (!$options["top"])   { $options["top"]   = 0; }  else { $options["top"]  = (int)$options["top"]; } 
    994998        if (!$options["limit"]) { $options["limit"] = 15; } else { $options["limit"] = (int)$options["limit"]; } 
    995999        /* create an array with the article titles */ 
     
    9981002        $articles[0] = "no article"; 
    9991003        while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) { 
    1000                 $articles[$row["id"]] = $row["title"]; 
     1004                $articles[$row["id"]] = stripslashes($row["title"]); 
    10011005        } 
    10021006        /* loop through the comments */ 
     
    10041008        $res_count->fetchInto($counter_r, DB_FETCHMODE_NUM); 
    10051009        $counter = $counter_r[0]; 
    1006         $res =& $db->limitQuery("SELECT * FROM comments ORDER BY date DESC", (int)$options["top"], $options["limit"]); 
     1010        $res =& $db->limitQuery("SELECT * FROM comments ORDER BY date DESC", $options["top"], $options["limit"]); 
    10071011        if (PEAR::isError($res)) { 
    10081012                die($res->getMessage()); 
     
    10161020                                        <?=$row["title"]?> (<?=$articles[$row["articles_id"]]?>) 
    10171021                                        <span class="log_cat"><br /> 
    1018                                                 name: <?=$row["name"]?>&nbsp;ip: <?=$row["ip"]?><br /> 
    1019                                                 website: <?=$row["website"]?>&nbsp;email: <?=$row["email"]?> 
     1022                                                name: <?=stripslashes(htmlspecialchars($row["name"]))?>&nbsp;ip: <?=$row["ip"]?><br /> 
     1023                                                website: <?=stripslashes(htmlspecialchars($row["website"]))?>&nbsp;email: <?=stripslashes(htmlspecialchars($row["email"]))?> 
    10201024                                        </span> 
    10211025                                </span> 
    10221026                        </div> 
    10231027                        <div class="log_contents<?=($row["deleted"]?" log_deleted":"")?>"> 
    1024                                 <?=$row["comment"]?> 
     1028                                <?=stripslashes(htmlspecialchars($row["comment"]))?> 
    10251029                        </div> 
    10261030                        <div class="log_foot"> 
     
    10931097        echo "\t<link rel=\"icon\" href=\"favicon.ico\" type=\"image/x-icon\" />\n"; 
    10941098        echo "\t<link rel=\"shortcut icon\" href=\"favicon.ico\" type=\"image/x-icon\" />\n"; 
    1095         echo "\t<title>".$title." - MvBlog powered</title>\n"; 
     1099        echo "\t<title>".stripslashes($title)." - MvBlog powered</title>\n"; 
    10961100        echo "</head>\n"; 
    10971101        echo "<body>\n"; 
  • trunk/common/functions_blog.php

    r116 r118  
    263263        if ($res->numRows()) { 
    264264                $res->fetchInto($r); 
    265                 $pagedescription = nl2br($r[0]); 
     265                $pagedescription = nl2br(stripslashes($r[0])); 
    266266        } else { 
    267267                $pagedescription = ""; 
     
    294294                while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) { 
    295295                        if($row["image"]) { 
    296                                 echo "\t<li class=\"link_list_item\"><a href=\"".htmlspecialchars($row["url"])."\"><img src=\"".$row["image"]."\" alt=\"".$row["linktitle"]."\" /></a></li>\n"; 
     296                                echo "\t<li class=\"link_list_item\"><a href=\"".stripslashes(htmlspecialchars($row["url"]))."\"><img src=\"".stripslashes($row["image"])."\" alt=\"".stripslashes($row["linktitle"])."\" /></a></li>\n"; 
    297297                        } else { 
    298                                 echo "\t<li class=\"link_list_item\"><a href=\"".htmlspecialchars($row["url"])."\">".$row["linktitle"]."</a></li>\n"; 
     298                                echo "\t<li class=\"link_list_item\"><a href=\"".stripslashes(htmlspecialchars($row["url"]))."\">".stripslashes($row["linktitle"])."</a></li>\n"; 
    299299                        } 
    300300                } 
     
    443443                        $r =& $db->query("SELECT COUNT(*) FROM articles WHERE aside = 0 AND date <= $max_time AND categories_id=".$k); 
    444444                        $r->fetchInto($count); 
    445                         ?><li class="category_list_item"><a href="index.php?action=archive_cat&amp;c=<?=$k?>"><?=str_replace(" ", "&nbsp;", $v)?></a>&nbsp;(<?=$count[0]?>)</li><? 
     445                        ?><li class="category_list_item"><a href="index.php?action=archive_cat&amp;c=<?=$k?>"><?=str_replace(" ", "&nbsp;", stripslashes($v))?></a>&nbsp;(<?=$count[0]?>)</li><? 
    446446                } 
    447447        }  
  • trunk/common/livesearch.php

    r83 r118  
    2424$searchstring = urldecode($_REQUEST["s"]); 
    2525$query  = "SELECT id,title FROM articles WHERE public=1 AND active=1 AND aside=0 AND"; 
    26 $query .= " (upper(title) LIKE '%".strtoupper($searchstring)."%' OR upper(head) LIKE '%".strtoupper($searchstring)."%' OR upper(body) LIKE '%".strtoupper($searchstring)."%')"; 
     26$query .= sprintf(" (upper(title) LIKE '%%%s%%' OR upper(head) LIKE '%%%s%%' OR upper(body) LIKE '%%%s%%')", 
     27        preg_quote(strip_tags(strtoupper($searchstring)), "'"), 
     28        preg_quote(strip_tags(strtoupper($searchstring)), "'"), 
     29        preg_quote(strip_tags(strtoupper($searchstring)), "'") 
     30); 
    2731$query .= " ORDER BY date DESC"; 
    2832 
     
    3842        $ret .= "\t<item>\n"; 
    3943        $ret .= "\t\t<articleID>".$row[0]."</articleID>\n"; 
    40         $ret .= "\t\t<articleTitle>".$row[1]."</articleTitle>\n"; 
     44        $ret .= "\t\t<articleTitle>".stripslashes($row[1])."</articleTitle>\n"; 
    4145        $ret .= "\t</item>\n"; 
    4246} 
  • trunk/common/tb.php

    r83 r118  
    3434                echo "</response>"; 
    3535        } 
     36        exit(); 
    3637} 
    3738$tb_id     = $_GET["id"]; 
     39/* check to see if this article is here */ 
     40$sql = sprintf("SELECT COUNT(*) AS count FROM articles WHERE active = 1 AND public = 1 AND id = %d", $tb_id); 
     41$res =& $db->query($sql); 
     42$res->fetchInto($row, DB_FETCHMODE_ASSOC); 
     43if (!$row["count"]) { 
     44        tb_response(1, "Invalid post."); 
     45} 
    3846$tb_url    = $_POST["url"]; 
    3947$title     = $_POST["title"]; 
     
    5058} 
    5159 
    52 $sql  = "INSERT INTO comments (name, website, email, comment, date, articles_id, title) VALUES ("; 
    53 $sql .= "'".$blog_name."'"; 
    54 $sql .= ", '".$tb_url."'"; 
    55 $sql .= ", ' '"; 
    56 $sql .= ", '<strong>".$title."</strong>\n\n".$excerpt."'"; 
    57 $sql .= ", ".mktime(); 
    58 $sql .= ", ".$tb_id; 
    59 $sql .= ", '".$title."'"; 
    60 $sql .= ")"; 
     60$sql = sprintf("INSERT INTO comments (name, website, email, comment, date, articles_id, title) VALUES ('%s', '%s', '%s', '%s', %d, %d, '%s'", 
     61        preg_quote(strip_tags($blog_name), "'"), 
     62        preg_quote(strip_tags($tb_url), "'"), 
     63         " ", 
     64        "<strong>".preg_quote(strip_tags($title), "'")."</strong>\n\n".preg_quote(strip_tags($excerpt), "'"), 
     65        mktime(), 
     66        $tb_id, 
     67        preg_quote(strip_tags($title), "'") 
     68); 
    6169$res =& $db->query($sql); 
    6270if (PEAR::isError($res)) {