Well, for a well designed CMS, you're going to need to sit down and determine what you want to accomplish and what features you. How easy will you make it for the user to place content? Will they have to learn some special codes like HTML or UBB? Will they be able to upload files? Will they be able to upload a Word doc and have it converted to HTML automatically?
Will the CMS system be open source so other coders will see the code? Will other coders be able to add modules? How easy will it be to add modules?
There's a lot of questions there. Session management in some flavor is going to play a very big role. I'd presume you'll have visitors, maintainers, admins, and super admins as your users. Each of them may or may not be able to log in and use various parts of your CMS tool.
Using classes and OOP design I think will help organize and structure your code. In doing so, this should allow for module development. In fact, maybe the entire CMS system is just a collection of modules. Its up to you.
File handling would be another big area. You'd need to handle file and image uploads. You'd have to manage where and how they're stored as well as how they're retrieved. You'll need to manage the security as well. Depending on what you want your CMS to do, some file conversions from popular office suites might be nice.
Caching content to speed up page loading times and reduce server stress is another thing to look at.
Handling RSS feeds might be nice. Maybe some form of journaling or blogging would be nifty (and make it conform to a blogging standard so other popular blogging apps could be used to add content to your CMS).
There's a LOT going on with a CMS. A lot of it when broken down to little pieces are not really all that tough. I think with a CMS, the biggest concerns (and probably the hardest parts) are how the database is designed and how the code will flow.